It even mostly works fine on IPv4 NAT, but there are a bunch of edge cases (often involving CGNAT) where it breaks down so you can't rely on it, which are solved by IPv6.
Hole punching works fine for IPv4 as well outside of endpoint dependent NAT, which most ISPs don’t use because it visibly shows up to normies as a bad connection in PlayStations/Xboxes.
Once you have to hole punch, you’ve lost the thread of why people bother switching to IPv6.
Once you have to hole punch, you’ve lost the thread of why people bother switching to IPv6.