I know, this topic is kinda old but there's no point in creating a new one. From my experience, there's a nice and standardized way to establish a P2P multiplayer session via STUN. It could be done wrong though. Dying Light implemented it so bad that we had to connect to the game in a specific order to be able to play or a player was kicked instantly. It has nothing to do with STUN itself though, just a bad game protocol implementation, reported lots of time, no answer.
In PAYDAY 2 they used the same scheme and it works flawlessly as long as we played. It's not hard to implement, really, there are tons of libraries out there and you can rely on existing servers across the Internet + setup your own. You'd also not be locked to specific ports, they could and should be chosen randomly. Players won't need to forward ports on their routers. Even two (or more) players each behind an ISP NAT could connect to each other! Only if both are not behind a symmetrical NAT though...
So, if everyone in the party uses Steam, send an external IP:port (obtained via STUN) to the others, they send their address back to the host (if it's possible, I have no experience in Steamworks; if it's not you'd need a master server for that exchange purpose) and you're all set. If some use the DRM-free version, you'll need a master server that just provides the list of hosted games with IP:port altogether. And if none of this works, you could display the user's own external IP:port so they announce it via any channel be it messenger or a social network or an SMS.
The CPU load and consumed bandwidth on the master server would be negligible anyway.