Guards are an implementation detail to the controller. The name of the controller should just be the controller and the location of the controller should be in the module with the feature it guides traffic for simply in a /controller folder. No more, no less. Don't put controllers in folders for roles or permission sets. That will end up making you crazy.
Your services should take in or know about the current session it is working on. Either you have via your authentication guard the user attached to the request object or you have some other method to know what session is being handled in your services. As you then know what session is being handled, you should also know what permissions the user has and as such, can make the right decisions in your services as to what to do and not do. Also, depending on what the controller can "pass" will depend on what the service should be doing. DO NOT make up different services for your permission sets/ roles. If you pass through a partner and a user to the same service, the service should be able to tell the difference and the decisions are made accordingly. If you, at that point, need methods specialized for each role type, then make them there or you can break them out to their own services. However, you break them out, not because of the role, but because the methods are completely different. What you should avoid is copying and pasting the same code, in order to have the same or similar method for each role.
If the differences in work are large or vast, what you might end up needing to do is to break the three roles either into their own apps. That depends, again, on how vast and different the work and processes will be.