Because the Fritzbox uses a DS-Lite tunnel.
Thanks, that pointed me in the right direction!
If I’m understanding https://en.avm.de/service/knowledge-base/dok/FRITZ-Box-3490/1611_What-is-DS-Lite-and-how-does-it-work/ and https://superuser.com/questions/1301857/using-pcp-port-control-protocol-in-practice correctly it seems that it’s technically via PCP (Port Control Protocol) that this is known, rather than DS Lite per se, but also that PCP only comes into play here because DS Lite is being used.
(Why point out the distinction? For future readers. I can imagine some braindead ISP somewhere (likely a super cheap reseller) offering DS Lite but then not knowing about PCP, and either not offering port forwarding at all - or they do but you have to fill out a form and snail mail them and then they snail mail you back a printed letter containing a list of port mappings.)
As a temporary fix, instead of service systemd-resolved restart as per the article, you can try this, service systemd-resolved stop
Once the service is stopped the port should be free. You’ll have to do this on every reboot (though maybe you can try adding the command to /etc/rc.local to stop it on every reboot)