Ok, I'm a little further along with my func_rotate_train testmap, for now I'm just slightly separating the waypoints in space so the bug I described is not an issue. I've run into the problem you describe, that things rotate the "long way round".
Now, I don't think that this is a bug as such. The entity should not be required to take the shortest rotation, because sometimes the long way might be the desirable path, and there's no need to require multiple path_rotates for that. What you need to do is add/subtract 360 degrees to the offending target angle.
As an example, you might have three path_corners with angles:
'90 0 0'
'180 0 0'
'270 0 0'
and you want to make the fourth
'0 0 0' to get it facing the way it began. But if you do that then it will turn the long way round. So then you try
'360 0 0'
and it works.
Until you try to make it a loop, rather than a single motion. Then you run into the same problem between the '360 0 0' and the '90 0 0' path_corner. This is a bit more of a problem, but I have devised a way to make it work...
download
http://www.btinternet.com/~chapterhonour/hiprot1.map
The essential trick of the map is that from rampath4-rampath6 the rotation is not controlled by the "angles" key, but instead by the "rotate" key, which sets a rotation rate. It does this at the corner where usually the rotation would reach the 360 degree mark. The "rotate" key handles this point more elegantly than the "angles" method does.
Spawnflag 32 is used so that "speed" specifies a 0.1 second travetime rather than 0.1 unit speed travel. This is combined with setting rotate to '0 200 0', to ensure 20 degrees are rotated on each of those segments, enough to put the rotation back into the positive quadrant. If you look closely this actually constitutes a speed-up on that corner, further tweaking of the values could control that.