I wound up having multiple playbooks and using something else to run them simultaneously.
I've used gnu parallels in some cases and jenkins jobs in others.
parallels is nice because you can kick off a lot of jobs simultaneously with a single command line.
However its not great for viewing progress as the output from each playbook isn't returned until its completed (iirc)
Jenkins jobs give better visibility of what's going on, but become tedious to set up via the ui if you have more than a few of them.
Other tools to orchestrate multiple playbooks are available (tower/awx, semaphore, vespene, rundeck) but I haven't spent enough time trying any of them yet to see if they offer any advantage.
That said it might be possible to do what you want in a single playbook, but you might need to get creative with your inventory.
Be aware that you can target multiple host groups in a single play
hosts: webservers:middleware:batchmachines
If you can address all the machines you need to manipulate then you might be able to set serial: 1 and perform rolling changes that way.
Hope the above is useful to you.
Jon