@Kiyodio1 welcome to the start of a deep and hopefully rewarding journey into multiplayer gamedev!
An immediate thing to know about game networking is without proper optimization techniques you quickly run into quadratic computation scaling concerns that can make a game experience dead on arrival. So in your case with 12-32 players under non-optimized implementations you’ll be sending 144-1024x the output and servers/clients will need to process all that at the defined tick rate (typically somewhere along 5-60hz). This is because each player update needs to update every other player e.g. n^2 Big-O rearing its head. The first rule of optimization for multiplayer then becomes, don’t send over the network what you don’t need to send. Second, minimize what you send over the network. Many techniques can be used to eliminate or reduce network utilization and compensate for the desynchronization caused by the pesky physics constant of the speed of light. Compression, delta compression, bit packing, interest management, network level of detail, interpolation, extrapolation, client side prediction, lag compensation, rollback, and more are all used to create a playable distributed simulation experience. Any netcode library you choose will use a variety of these techniques, some more than others. A number of these techniques are overkill for certain genres and player scale. So like anything in life, it depends on your needs.
It sounds like cheat-prevention / competitive integrity is not the highest priority for your title. Usually that entails reducing costs by using a listen server topology (Unity Relay, Steam Relay, etc.) often categorized as peer to peer (p2p). However, in such a topology a client-hosted model requires one of the players to act as the server and therefore will bear the largest burden of computation and network transmission. Given 12-32 players and hundreds of horde like entities it’s possible, but will be challenging, particularly when you don’t know what client device and network capabilities will be. Is your game 2D or 3D? Which almost certainly adds an extra dimension of resource utilization and impacts scalability of your multiplayer solution. As such, dedicated game servers (DGS) usually end up being the solution of choice for scalability needs. That leads you down a further path of needing proper hosting orchestration (Unity Multiplay, MSFT PlayFab, AMZN GameLift, etc.).
Given your game is clearly GameObjects based, Netcode for Entities is not an option. The announced unified netcode solution is also not an option, the timeline on that is too far out. FishNet doesn’t support ECS either and clearly the author can speak to whether a version ever will, but you need something now. So, my recommendation is to experiment with multiple GameObject based netcode libraries. Work through their samples and documentation to get a feel for what multiplayer game development requires. There will be many similarities, but the most important thing is learning to think in the multiplayer domain.
Unity Netcode for GameObjects (free, Unity Companion License) and Photon Fusion (paid) likely have the most robust documentation and samples to explore and accelerate your learning. Coherence (paid) is a newcomer on the scene with a robust end to end offering that “just works”. KinematicSoup Reactor (paid) has the best demonstrable performance for any GameObjects based solution. FishNet (freemium) and Netick (freemium) are well rounded and might be your final destination if you need scalability features and relative lack of vendor lock-in. Mirror (free, open source) is a mature community project it’s not known to scale as well as many of the other offerings, but with recent feature improvements that’s changing. All of that comes with tradeoffs in ease of use, near and long-term support, features, pricing, etc. So it’s worth taking a couple weeks to rapidly ramp up on a few solutions and then make a more clear decision for your specific needs instead of fully relying on us forum posters.
Good luck!