In the end the answer was that each video frame had to be copied between buffers about three times with Chrome, among other things, whereas mplayer was able to draw directly to the framebuffer.
Now I'm not saying it isn't theoretically possible to make this fast (and Chrome has various optimizations nowadays for a select number of platforms), but abstractions can be expensive - especially for video.
It's best to go as native as possible if you're on underpowered hardware or want to go easy on your user's battery life.
Disclosure: I work on Stadia, and am speaking only for myself.
[0] https://9to5google.com/2019/11/08/google-stadia-app-play-sto...
Because obviously then it would be irrelevant whether it's Safari, Flutter or Visual Basic.