After checking that you can open port 53 udp yourself with, say, nc (which you tried), strace the binary that tries to open port 53 and fails, and find the system call that fails. You can compare it with an strace on nc to see how it differs.
If this doesn’t clue you in (e.g., you see two attempts to listen to the same port…) Next step would be to find in the source code where it fails (look for the error message printout) and start adding diagnostic printouts before the failing system call and compile and run your edited version.
Ubuntu user here. Swapped away from Debian in its early days when Ubuntu made a real effort to stay current with the desktop environment (even coordinating their releases after GNOME), and back then it mattered. Nowadays my few attempts at other distros suggest that the hardware driver situation (especially proprietary) seems better on Ubuntu, for example to get everything working on fairly new laptops.
There are of course other things I’m less happy about. The snap installs via apt drives me crazy; not that I necessarily hate the technology, but sometimes I need a non-containeraized browser (for example to run inside another container), so I need to be allowed to choose what is being installed.