After banging my head for over an hour I decided to see if maybe, just maybe I did something wrong with the speed calculations and tried 19200 instead of the 9600 everything was set to work at. 'lo and behold, it worked. I had read the short USART section 3 times over and knew I did everything according to it. The only suspect was the U2X0 bit. So I tried setting it and the result was the same, the speed was still at 19200. So I forcibly cleared it during initialisation even though the datasheet says it's cleared on power-up and finally I had my 9600 bps.
So from now on I will always forcibly clear it when not wanted, but why is it set? Is the datasheet wrong? Did I miss something? Is it the bootloader doing something?
Edit: The board is an Arduino Pro mini that was supposed to be 16MHz but the vendor unloaded some 8MHz onto me. :( So Atmega328P 8MHz and I'm using VSCode with PlatformIO.