TCP punch through is a thing as well. It's slightly more complicated than UDP punch through, but entirely possible. IPv6 should remove the need for NAT, but IPv6 isn't fully rolled out yet, so some players are stuck with IPv4.
I think the idea TomD and I share is TCP hole punching would act as a failsafe for UPnP. Often UPnP fails (I've never had the UPnP part of TNet report a success) for users, and, being users, they are often too inexperienced / inconvenienced to open the port on their router manually. Hole punching would, in theory, eliminate that problem. I don't have a server or a second LAN to test on, so unfortunately I can't test this theory. I believe it would require 3 sockets all bound to the same port. Socket #1 connects to the facilitator, Socket #2 accepts connections (as the TcpProtocol class currently does), and Socket #3 would be used for sending the SYN packet. You can find a PoC in C# on github doing something similar, so it's definitely possible. However, that PoC is primarily for connecting two peers. In TNet's case, we need to connect multiple clients to a single server, so might need to adapt it.
It's an interesting problem to solve, and making port-forwarding a thing of the past would be beneficial to everyone.