We're single process! Multi-process is opt in (it's useful to toss your telemetry and other non-critical code in a separate process so a crash doesn't take down everything), our units are libraries by default. When you make a launch file you're actually composing together libraries at runtime. We also support passing CUDA handles (or any runtime only struct) within a process. See https://github.com/basis-robotics/basis_test_robot/blob/main... - this is a struct containing a CUDA handle, it isn't copied to CPU nor serialized unless you request it over network (ie with Foxglove) or serialize it to disk.
As for why not capnproto - I'm more experienced with protobuf. No good reason, in this case, other than popularity.