exit(0) was causing memory errors during shutdown of this forked process, in an unreliable way (only visible on CI system).
Example: https://build.bitcoinabc.org/viewLog.html?buildId=28627
@Fabien and I found that failure was happening since --logger=JUNIT passed in to the boost test suite (D5042). The most reliable way to see the errors on exit was (with either clang or gcc compiled):
valgrind ./src/test/test_bitcoin --logger=JUNIT -t util_tests
Since we're using fork() anyway, we might as well just run execlp() which nukes the child process image. As a bonus this stops valgrind from producing any noise about this child process.