

Tailscale has several NAT bypass / hole punching methods for double NAT (including CGNAT) and symmetric NAT, but they don’t work in 100% of cases. https://tailscale.com/blog/how-nat-traversal-works
IPv6 is definitely a good solution since then you don’t have to deal with NAT at all. IPv6 is pretty easily doable in the USA (at long as you’re not using Starlink) but can be harder in other countries that don’t have as robust IPv6 infrastructure.
I usually use HTTPS, because a lot of web features only work over HTTPS.
You can use Let’s Encrypt DNS challenges to get real TLS certificates for internal hosts, instead of having to use your own CA or self-signed certificates.