Ah, the problem of having to control slow motor speeds with insufficient resolution for speed sensing. There is no good or simple solution this, or solution at all. By far the best idea is to use a higher resolution encoder.
You can, of course, interpolate the encoder position e.g. by assuming that the time difference between two latest events (i.e. speed) remains constant and thus keep ramping the position variable blindly.
Or just try to make the control loop as good as humanly possible, meaning extreme effort at tuning the PID variables but also adding other strategies like feedforwards. Anytime your feedback signal sucks, feedforward is the obvious solution, but then you need some kind of model of the system. Simplest types of feedforwards are, (1) just add a term with a ff_constant * setpoint, (2) add ff_acceleration_constant * (setpoint - prev_setpoint).
I had similar situation with a mobile robot with two motorized wheel with only the 6-steps per electrical revolution hall sensors. At high speeds it maneuvered fine but slow speeds were impossible to tune. FF(setpoint) + FF(derivative of setpoint) + P + I + D all carefully tuned made it relatively OK-ish but the final thing that fully stabilized it was another feedback, from gyroscope yaw angle angular rate directly to motor currents. That one reacts very fast, even to small changes. Like, if one motor was getting just a half of a hall step ahead of the other, that was already showing as significant rotation of the robot, drunk mode oscillations ensuing. Gyro feedback fixed that simply with just a few lines of new code. Much easier than trying to solve the problem by tuning the PID loop until cows come home.
I could have added feedforward component from the orientation of the robot; i.e., going uphill more current is needed. The advantage of feedforwards is, they react quick and can't cause oscillations.
So maybe see if you can find secondary sources (other than the measured rotor speed) for feedbacks/feedforwards. If nothing physical to measure, then feedforwards from the setpoint and setpoint derivative still help.