We have every screen be a "UIScreen", which only has the virtual methods: init,show,hide. Show and Hide has SetActiveRecursively in it. So a more advanced screen would extend/inherit/implement those functions and do more advanced stuff in it. My main screenController will just call init once the first time it's loaded and call show/hide as needed.
If I need certain widgets and colliders to be off, I tend to turn them off on a component basis, as this isn't fucked up by SetActive or SetActiveRecursively.