Hi Peter,
I've found that when you start wanting to invoke sections of a role independently, that's usually the time that you should break that role up into multiple separate roles. This makes reuse and separate execution much easier. You can have a structure that looks like this, too:
roles/aws/net/tasks/main.yml
roles/aws/vm/tasks/main.yml
...for nice nested organization of roles.
You can then call the roles individually, and if you need to, use role dependencies to enforce one to run before another.
Hope this helps,
-Tim