I think a big part of the issue is that no two tables are the same. What works in one table may not work in another (even with the same DM). So a fix that works for one table won't for another.
I've tracked damage done by different classes in home games and they're reasonably close given that I don't expect the same damage output from every class (out of combat and support options matter). But there will always be different spikes and valleys at different levels, and different campaigns will have different combat and out of combat expectations.
This is what I found by tracking only damage that removed hit points. Novas feel great but the damage that,matters can be illusory. Your paladin can roll 101 damage on his crit but if the thing had 5hp left, he did 5hp.
Also, mix up your encounter building, some big monsters alongside some mooks. Add scenarios with time limits or where time flows faster to discourage long rests. Add monster patrols to make short rests more tricky. All these variations will produce roller-coaster damage outputs where your fighter and Rogue types will be more consistent than the other classes.