[...]
Seems like this another example where gdb suffers from having two code
bases (gdb, gdbserver) to implement the same functionality.

Ironically, any discussion of sharing vs duplication would have been
happening a few dozen steps away from where you and I were sitting at
Cygnus back in 1993. :-)

I don't remember if there was much talk about it back then, but if there
was, it probably seemed like an impossibility, especially considering
the shoestring that Cygnus operated on at the time. The whole idea of a
target vector interface was still pretty new, and control flow was in
reality much more intertwined and config-macro-dependent than the target
vector pretended.

I think all new debugger designs are separating the low-level inferior
control sufficiently to build debugger and server using the same code if
desired.