La domanda è: quanti sono questi "tanti dati" da scambiare, almeno a livello di ordine di grandezza? Perché se non ci sono problemi di prestazioni io eviterei la memoria condivisa come la peste per i motivi di sincronizzazione citati da oregon - e questo vale in particolare se si tratta di un'applicazione industriale che non si deve intoppare nella maniera più assoluta; scegliere di perdere qualcosa in prestazioni (purché ovviamente restino accettabili) ma evitare il rischio di race conditions e deadlock a mio avviso è la cosa più ragionevole per avere un sistema robusto.
Inoltre, come detto, un socket locale non fa altro che passare i dati in memoria, per cui le prestazioni sono comunque elevate; ma soprattutto, è il sistema operativo che ti dà delle garanzie di sincronizzazione (quindi non rischi di fare errori nell'implementare il tuo), ed è un modello di sincronizzazione sufficientemente semplice/prevedibile da non darti particolari preoccupazioni. Infine, se per qualche motivo in futuro dovessi spostare uno dei due processi su un'altra macchina, non devi cambiare quasi nulla della logica del programma.