For anyone reading this later...
I finally dived into what was consuming all the CPU time in gnome-shell. Turns out most of it was spent in clutter_actor_finish_layout in clutter-stage.c, part of gnomes layout engine.
The function runs fast, but was being run thousands of times per second. Every object on the screen (ie. every menu icon, every status icon, every bit of text) was having its position recalculated at 60 fps.
Someone has already noticed and fixed the bug:
https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2679
So in 12 months time, the fix will hopefully make it to everyones distros releases. Till then, enjoy the warm lap.