Most servers use BungeeCord to achieve this. BungeeCord is basically a proxy server.
This image can explain what BungeeCord does in a nutshell.
This site can help you with BungeeCord's configuration. https://www.spigotmc.org/wiki/bungeecord-configuration-guide/
This site can help you with the installation of BungeeCord. https://www.spigotmc.org/wiki/bungeecord-installation/
You need to have atleast 3 servers for BungeeCord to be usable, but you should have 4 or more. 1 Server is BungeeCord, the server your players connect to. That server redirects to the hub, and the rest are gamemodes. The reason why you should have 4 or more is because it wouldn't make sense to have only 1 gamemode.
There are a ton of YouTube tutorials on how to operate BungeeCord. It's a bit daunting at first, but you'll get used to it. If you don't want to go through the process of setting it up, some server hosts will offer to set it up for you for some money in return.
For the whole "spin up" thing, I've never actually done something like this, but I could give you some idea on how you would go about it.
Players try to join skywars, but there are no skywars servers. Send signal to a script, or whatever you use to manage your servers (like docker), etc, that a skywars server is needed. Script/server managing software runs the java command to start the new server. New server finishes starting, and New server tells other servers that there is a skywars server available. Send players that queued for skywars to new skywars server. When game starts/is full, whitelist skywars server (or tell other servers that you cant join it from the hub or something). When game ends, send players to hub, stop server.
I don't really know how you would send the signals to the other servers/signal to start the servers. That's kind of in your own hands, since there are a lot of ways you could do that.