The pipe vs. socket perf debate is a very old one. Sockets are more flexible and tunable, which may net you better performance (for instance, by tweaking buffer sizes), but my guess is that the high order bit of how a UDS and a pipe perform are the same.
Using pipes instead of a UDS:
* Requires managing an extra set of file descriptors to get bidirectionality
* Requires processes to be related
* Surrenders socket features like file descriptor passing
* Is more fiddly than the socket code, which can often be interchangeable with TCP sockets (see, for instant, the Go standard library)
If you're sticking with Linux, I can't personally see a reason ever to prefer pipes. A UDS is probably the best default answer for generic IPC on Linux.
Using pipes instead of a UDS:
* Requires managing an extra set of file descriptors to get bidirectionality
* Requires processes to be related
* Surrenders socket features like file descriptor passing
* Is more fiddly than the socket code, which can often be interchangeable with TCP sockets (see, for instant, the Go standard library)
If you're sticking with Linux, I can't personally see a reason ever to prefer pipes. A UDS is probably the best default answer for generic IPC on Linux.