I found that git worktree works rather well, even with submodules (well, mostly. Even if it doesn't for some reason, you can still update and init the submodules manually, losing sharing in the process).
I mostly do this:
$ cd ~/code/hs/ghc
$ cd pristine
$ git wtas ../pmcheck
and mostly just hack away. From time to time I seem to have issues because of confused submodule references, but as I said above doing a `git submodule update --init --recursive` fixes that. Cloning the root GHC checkout is the most time-consuming step, after all.
Also I'm currently in the rather comfortable situation of having an 8 core azure VM just for GHC dev, which is pretty amazing. Doing the same as Ben here: Having a tmux open with one (or more) tab per checkout I'm working on in parallel. VSCode is my editor of choice and seamlessly picks up any SSH connection I throw at it. Can highly recommend that when you're on a rather weak machine like a laptop or convertible.