Hi Neil,
having to decide between two different techniques for formal verification may be seen as a luxury.
In my experience, TLA+ is most useful when reasoning at the algorithmic level. At this point in time, to my knowledge there is no formally verified pathway from a TLA+ specification to a correct executable implementation. This being said, LLMs appear to become capable of generating code from TLA+ specs, and there are techniques such as trace validation for checking implementations against TLA+ specs – even if they do not give you as strong correctness guarantees as a formal proof, they are very effective for catching bugs.
Frameworks such as Verdi [1] (implemented in Rocq) have been designed to formally prove distributed systems, going all the way from algorithms to executable code, and they have impressive results. I would expect such a framework to require more proof effort because you have to reason at a lower level of abstraction than your typical TLA+ spec. Another potential drawback is that you are limited to the programming primitives that the framework provides, unless you are prepared to extend it.
My 2 cents,
Stephan