Hi friends, I've tried poking around with ways to solve the headless pyros etc while still removing hats. Here are my findings:
Attaching bodygroup models to the main model in the .qc file: Editing the QC file trips sv_pure 2 up straight away. I don't know anything about preloading but this basically doesn't work.
Joining the character body and bodygroup models together in Blender and recompiling the model: Breaks eyes on the model and crashes the game when joining sv_pure 2 servers 90% of the time (it worked once but when taunting half the parts of the character stretched towards the origin of the map, and the rest were in the complete wrong place so the character became a swirl of body parts. I think this is a problem with decompiling animations because I recall the same thing happening when playing animations in Blender????). Very strange that this doesn't work and I suspect it might be due to decompiling/recompiling character models being super fucky.
So the only option seems to be old method I discussed here. I did a really bad job explaining my method so I'll do it here because it wouldn't really be feasible for one person to go through every hat using a body group with this method.
You'll need a decompiler. Everyone uses Crowbar these days I think. Decompile every class model from the .vpks (you'll need to extract them using GCFScape first). You should end up with a bunch of .smd files. You can use an addon to allow Blender to import these (not sure where to find this anymore because it keeps getting outdated and moving around or something). The SMDs should relate to the base class model, and all the bodygroups. The key to this method is replacing the SMD of the hat that disables a bodygroup, with the SMD of the bodygroup it replaces. Do this by decompiling the hat (make sure to check the .qc file for any problems. Usually the directory path is missing some characters for some reason. Look in GCFScape for the correct directory), and replacing all the SMDs (there'll probably be a few for different LODs. Make sure to replace the LODs with the appropriate bodygroup LODs. They're named lod0, lod1... etc so its pretty straight forward) of the hat with the SMDs of the bodygroup(s) it disables by changing the filenames of the bodygroup SMDs to those of the hat SMDs. Then, recompile the model using Crowbar. For hats with different styles, make sure to replace every SMD. Some hats disable multiple bodygroups. Due to Source engine Nazi Space Wizardry, this is an easy fix. Import the 2 relevant bodygroup models (ie: the models of the 2 bodygroups that are disabled) into Blender, highlight both models by shift clicking (I think), and join them with Ctrl+J. Export the now-single model, and rename it appropriately. Don't worry about textures, somehow the Source engine applies the correct textures for each model, even though they're now just a single model (see aforementioned space wizardry). Just put the new hat files into a VPK like with the normal no-hats-mod. Repeat this process for every hat that disables a bodygroup (vomit).
Feel free to ask for any clarification. It'd be pretty cool if a bunch of people worked on this to get it up to date but it doesn't work half the time for some reason (like, some hats just show up. And not the usual offenders like the Pyro mask) and the fixed hats only use red team textures (this could probably be fixed by editing the .qc file but that fucks with sv_pure so yeah) so it might not be worth the time idk.
Edit: TL;DR: Decompile character model and hat > replace hat SMDs with bodygroup SMDs from character model > check hat .qc file for decompile errors in the file path (happens with my version of Crowbar that I can't be bothered updating) > recompile hat > put new hat files in VPK. Repeat for every hat that disables a bodygroup.