There are "Dynamic DNS" services (a good free one used to be DynDNS in the 00's) that will take an API call from your home system and update a DNS with it.
Many routers have support for this and if your router runs dhcpcd you can tell it to issue the call when it renews the DHCP lease from your ISP, or simply cron job it.
Note that you don't need a marketed-as-"dynamic DNS" provider to have dynamic DNS. You just need a DNS provider with an API.
Cloudflare has a DNS API. So if you search "Cloudflare DDNS" you'll find five or six different Github projects (some binaries, some scripts) you can run on any box in your house (maybe a Pi?) that'll do your DDNS through them.
(You don't need your router to run a DDNS client, even though routers make it seem like a router-exclusive feature. The only thing your router knows that your LAN doesn't is your network's external IP address. But a DDNS client can just hit an external reflector endpoint for that.)
From my experience most ISPs don't give publicly routable addresses anymore, just throwing everybody behind CGNAT (currently I pay extra 3$ monthly fee for static routable IP, but not all providers offer it). And IPv6 is usually still not deployed.
As the other comment says, I've never seen CGNAT in the US. I'm sure it's deployed in some cases, but I've never had to deal with it.
I'm confused about it though. For some applications and games you need to connect peer-to-peer for them to work correctly. How is it possible to connect to a peer with some random port open (e.g. 48295)? It doesn't seem like the ISP could know that the request was aimed at you, if something like UPnP isn't being used. Or does CGNAT simply disable all incoming connections, breaking p2p applications entirely?
Many routers have support for this and if your router runs dhcpcd you can tell it to issue the call when it renews the DHCP lease from your ISP, or simply cron job it.