rhg is supposed to be a transparent executable, using a subprocess defeats
that purpose. See inline comments for more details.
This also introduces the which crate to check if the fallback executable
actually exists to help debugging (plain execve doesn't give much
information).
The error code 253 is used to signify that the fallback is not found, but may
mean in the future that it is otherwise invalid if we start being more
specific.
Since you said you used the which crate in order to make debugging easier, it surprised me that you just call .is_ok() here. How about replacing it by a if let Err(err) = ... and debug message based on that err?