Encountering Gimbal Lock when using Transform.Rotate(Axis, Angle)

Hi, folks! I have a question about avoiding gimbal lock when using Transform.Rotate(). So, I’m making a simple “Inspection” interface, where users can drag the cursor across the screen to rotate a 3D object.
Here’s what it looks like when it works.

I’m rotating the object using Transform.Rotate() and an angle/axis pair, calculated from the cross product of the user’s mouse direction and the camera’s forward vector. Everything works pretty darn well, except for when the camera I’m using is pointed 90 degrees straight down (euler 90, 0, 0) – suddenly, I can only rotate the object horizontally to the camera.
Here’s what you get when it fails!.

Rotate that camera back down to (85, 0, 0) and things work again, but I do need the straight-down angle to work and I’m pulling my hair out trying to deal with this one. I dimly remember dealing with a similar problem – which my peers called gimbal lock – back when I was a little more naive, and would try to rotate objects by directly changing the components of transform.eulerAngles. It’s been my impression that the whole angle-axis system wouldn’t be prone to the same issues, but it seems that’s not the case.

Anyway, I’d greatly appreciate it if you guys have some information about how I can solve this problem. For reference, here’s the source for the rotation functionality:

//Get the vector direction of the user's mouse / finger as they drag:
Vector2 mouseDiff = (Vector2)Input.mousePosition - oldMousePos;
//Calculate the desired axis of rotation by crossing mouseDiff with the camera's forward vector
Vector3 axis = Vector3.Cross((Vector3)mouseDiff.normalized, camera.transform.forward).normalized;
//Calculate the amount to rotate this frame:
float angleDiff = mouseDiff.magnitude * rotateMouseSensitivity * Mathf.Deg2Rad;
//Do the deed! :
Object.transform.Rotate(axis, angle, Space.World);

//Update oldMousePos
oldMousePos = Input.mousePosition;

If you don’t want gimbal lock you’ll most likely need to use Quaternions instead of angles.