Not all is lost. The engine for doing multiplication and division actually uses 4 bytes, so there is a bit of leeway the function for calculating experience. I whipped up a little something in about an hour.
Try implementing the changes in
this commit. This updates the CalcExperience function to do math with 4 bytes instead of 3 bytes. This will prevent the left-most byte from being dropped and give accurate math. Since pokemon are still restricted to 3 bytes of exp, I also made it so that it dynamically lowers the max_level for each pokemon (based on growth rate) such that the maximum experience achievable stays within 3 bytes. Theoretically, mons with the fast growth rate can go all the way to level 255 now while mons at the slow growth rate are capped to level 237.