Both QUIC and TCP hole-punching need a co-ordination server to ensure that both peers attempt the hole punch at roughly the same time.
WebRTC also needs a signalling server to co-ordinate SDP and share the candidate address list for ICE.
We have a spec at libp2p/specs#173 to use Circuit-Relays for co-ordinating hole punching.
We can also use the same idea for signaling in the WebRTC transport implementation.
Edit: As flagged by @aschmahmann AND @jacobheun , we do need to consider limited bandwidth allocated by relays to peers after we get hole punching in as they shouldn't need relays for data transfer anymore.