Thanks for the post, nice reading.
Patterns you describe are normally used when services do work independently, but in real life most of the interactions are request/response, i.e. calling service expects some result from other service.
So, I wonder how do you deal with request/response pattern.
By my experience there are following approaches:
1) if your queue vendor allows, a publisher sends a request to queue and does blocking wait until a response came back. So, this is hardly better than gRPC-like approach (or REST at the end). But here we have mutually dependent services what we are trying to avoid.
2) Another way is an async interaction when a publisher posts a command with some correlationId and gets response some time later and process it in async manner. But implementing all complex interactions in such a manner will be a pain in the neck.