Oscillations are likely due to a not very well adjusted PID controller. I don't know how much experience you have with those, but they can be finicky to learn to set them up properly. Another possibility is that you simply do not have enough resolution to measure the back EMF properly at low speed. I guess it's not going to be (much) better when using both algorithms.
It is useful to measure the motor current. You can use it for overload protection (also note that short overloads (up to about 200% or 300% of the nominal motor current) can be acceptable, but the motor will overheat over time. With a uC you can keep track of the motor current, and extrapolate motor temperature (with temperature decay when current is lower) These will be rough estimates, but you can get a lot more torque out of your motor for short durations, compared with a hard cut off with the comparator as soon as the motor current exceeds a limit.
For your software...
I don't like "arduino programming". One thing that looks suspicious is to call timer1_setup() repeatedly inside your while loop. And why have a while(1) loop at all? The silly arduino thing already does this in the loop() function.
I am also not sure whether your detection of the end of the PWM pulse works, and why are you switching the PWM pin to input?
Also very arduino are software delay loops. Any ISR's during such a delay will increase the delay, and this will have an influence on the timing of the PID loops. The I and D parts of a PID are timing sensitive, and timing variation will decrease it's accuracy.
You have measured mosfet switch time (as long as the thing does not get too hot then it's OK) so I assume you have an oscilloscope. You can use an arduino pin, set it to an output, set it when an ADC conversion starts, and clear it again when it finishes. This lets you verify the sampling with the back EMF voltage so you can see whether you are measuring a stable back EMF voltage. It's a simple but useful debugging trick.
I started programming long before arduino, and would use another approach.
1. Have a timer tick ISR that starts an ADC conversion.
2. When ADC conversion is complete, run the PID loop and start a single PWM pulse.
This guarantees consistent timing for an accurate PID loop, and it leaves your main loop completely free to do regular tasks such as handling user I/O. It is more work to set up, as you need to know more details about your microcontroller, but once set up properly the software is not much more complex.