The bind(c) approach works to use multiple Fortran compilers in the same project, except descriptor arrays, which do have an API, but not an ABI, and while one could write adaptors per compiler, as suggested here: blog/Dealing_with_imperfect_Fortran_compilers_2.md at main · jeffhammond/blog · GitHub, it would be better to figure out an ABI for this, like for the rest of the bind(c) features.
One can imagine adding more Fortran features into this bind(c) subset.
There is some tiny overhead at the API boundary, as the Fortran compiler must convert internal representation to the ABI-stable C interface, but this is made explicit by the programmer using bind(c) in the function declaration. The data is not copied but the descriptor might. That seems acceptable.
The bind(Fortran) approach might work in a similar way. Possibly it might not even be needed if bind(c) is powerful enough.