I'm just reponding to each statement/question here separately, disregarding context.
The problem with UPnP is that Game Maker has no support for it. The only way to solve this is using an extension.
You could theoretically just start a UDP server, do a search for UPnP compatible devices with a multicast on port 1900 UDP, wait for response, then if you got a response, just get the IP, send a request for a new port mapping... No extension needed.
Google "upnp http request" or similar to learn more.
For the type of game I'm making it's used a Peer to peer architecture because it's needed that all player are in equal conditions so if a player has high ping all players "slow down".
So, it's just needed for lag compensation, or rather just to keep clients in sync at all times?
Using P2P just to ensure synchronization is like taking chemo because you're tired of shaving your head...
Also, I want to know why do you think pure P2P is hard to implement because I usually hear the opposite.
This depends on what sort of game it is, how much data is transferred, if it's necessary to check clients for desync, etc...
It's hard in the sense that contrary to a traditional server/client-setup, there is a lot of overhead.
When a player connects, you synchronize the clients. During normal gameplay, you have to make sure that the clients stay synchronized, and so on...
This is much easier when clients are handled by an authoritative server.
I don't really care about cheating because players will decide with what people wants to play
This might not pertain to you, but:
Say you have a PvP game where you only play with people you want to play with, or it's a PvE or other sort of player vs. something.
If it's the former, then you might as well go with host-migration, seeing as it is faster and with less overhead.
If it's the latter, you run into a problem with deciding how non-players act.
Say you're making a PvE TDS where you fight trolls: How do you decide where the enemy trolls move? Who do they attack?
You might think that synchronizing random-seeds, etc. will help, but then you run into the issue of latency causing desynchronization.
The only way to ensure that clients stay synchronized in a case like this, is to have an authoritative peer that decides how enemies act; then you're back at traditional server/client with host-migration being the better option.
I'm not trying to discourage you. Who knows, P2P might work for you!
I wish you the best of luck!