The problem is that your algorithm only accounts for translations-over-time, and not rotations-over-time.
During your 30fps run you only make one angular correction for every four angular corrections made during the120fps run. At frame zero the rotation and position are aligned. At frame 1 of the 120fps run the two paths are still perfectly aligned, but this is where the paths begin to diverge. The forward path is rotated, but the 30fps path maintains the same trajectory. Step forward to frame 2 of the 120fps run and the paths diverge even further, then again on the third. Finally, on the fourth frame at 120fps, and the FIRST frame change at 30fps the trajectory of both paths is rotated. Now the two paths are probably along parallel vectors, but their positions are different. As the frames continue and the paths curve they will sometimes diverge and sometimes converge, but they’ll rarely align perfectly.
What you need to do is apply the distance traveled along-a-curve, rather than in a straight line.
But even then, if you are updating the shape of the travel path (e.g. by steering) every frame then the curves defined at 120fps and at 30fps will not be identical. In this case, you would have to modify the travel vectors at the same rate regardless of drawing fps. You can either make the faster frame rates skip updates, or make slower frame rates perform multiple updates per frame.
The second option is, basically, physics sub-stepping.