In trying to solve this issue of pushing/popping view controllers with different orientations, one solution seems to be two UINavigationControllers, one to handle the portrait orientations and the second to handle landscape orientations.
Assume A and B are portrait view controllers; C and D are landscape view controllers.
In other words, pushing B->C should yield landscape, C->D should also be landscape, but popping from C->B should be portrait.
UINavigationController1 is a custom UINavigationController class that always forces portrait.
UINavigationController2 is another custom class, but this one forces landscape.
A and B are embedded inside UINavigationController1.
C and D are embedded inside UINavigationController2.
When pushing from B->C, we push UINavigationController2 onto the stack of UINavigationController1.
So far in testing it seems to work, but is anyone aware of any potential gotchas? The fear is there are some lurking performance/behavioral issues that won't surface until much later.