I believe the correct way to do this is to measure the angle to turn through both clockwise and anticlockwise. Then choose whichever has smaller magnitude and rotate in that direction.
Is there a simple formula to do this?
Your "dot" is the sine of that angle.
I like to relate this to cross product. From wikipedia you have:

Where the magnitude (length) of the purple vector pointing up is given by:

So if "a" and "b" are unit vectors the magnitude of "axb" is the sine of the angle between them.
The magnitude is given by

.
This then corresponds to your code where:
d=bx
c=by
b=cx
a=cy
dot = d * a - c * b
Notice that vectors [bx,by] and [cx,cy] are unit vectors since you calculate them using sine and cosine of an angle which by definition gives you coordinates on a unit circle.
The problem with the previous approach is that you probably get something like:
Ship.DestAngle = 10
Ship.msngFacing = 360
This means:
det > 0
and
Ship.msngFacing > Ship.DestAngle
Which executes:
Ship.msngFacing = Ship.DestAngle
This is where the ship jumps from 360 (which is 0) to 10 (DestAngle).
The easiest way to remedy this is to check for:
det<0
instead of:
Ship.msngFacing > Ship.DestAngle
within the inner condition.