I've done this before for a complicated piece of work I did. I had roles running on several delegate proxies (yeah I called them that, since we had 5-6 of them :)).
However I did not delegate a role in mycase, but all the tasks were written with delegate_to: "{{ delgate_host }}" where I can override delegate_host variable at the role level.
I do not believe this is a widely used regime, and I did ran in to some issues when you call role -> role -> role, the last layer lost visibility to all the top level variables. Like @Dick Visser said this will not be the smoothest sailing, but surely works.
I wrote this originally for Ansible 2.9, but when I tested with 2.11, most of the issues I faced were gone.