It's not really an issue with the 8 Direction behavior, but with how the lerp is implemented. Your code is not framerate independent.
Framerate independent lerp example:
lerp(CurrentValue, TargetValue, 1 - (0.05 ^ dt))
In this example, 0.05 means that after 1 second, only 5% of the difference remains. Lower values = faster / Higher values = slower.
If the function does not run every tick, then you would need to replace dt with the elapsed time since this function last executed.
In that case, use the elapsed time since the previous function execution instead:
lerp(CurrentValue, TargetValue, 1 - (0.05 ^ TimeElapsedSinceLastExecution))
You should apply this to every lerp.
Sidenote: Since this code is inside a function and i don't see how it's being executed... the function should run once every tick for the lerping to behave as expected.