I've tried both independent controllers, and a single controller with conditionals. It's not fun dealing with slightly different behavior with types and modes. Different controllers will have a lot of repeated code. A single controller with ifs for each type will get very wordy.
My suggestion is to write out a couple of different controllers for two of your user types. When you see the equivalent behavior, move it into a parent controller and make the other two into children. Then finish your remaining two controllers as children of the parent controller. You should see the payoff pretty quickly.
As for the HTML, it's likely best to have different pages/partials for each. ng-include and ng-if would be nice for this.
Here's a quick explanation of parent/child controllers.
And the template design pattern will be pretty helpful. I expect it to work properly between parent and child controllers.
I'm more than happy to hear other opinions since I've hit this issue a few times, myself.