At Plasma Robotics, we use a sort of "ghetto-PID" with a gyro - basically, we have a loop that turns the robot, slows it down once it's close, and stops once it's within an acceptable range. It then waits for a few milliseconds to make sure it doesn't overshoot - if it does, we start the process again.
It's not quite as accurate as a PID, but it's easier to understand and debug. That is, unless you do it in LabVIEW like we did and have wire-spaghetti all over the place
