Velocità del loop Mega 2560

Per quanto riguarda l'uso della RAM, è vero che i due buffer di trasmissione e ricezione vengono allocati indipendentemente dal fatto che si usi la seriale o no. Per quanto riguarda le schede basate sul 328, questo rappresenta un problema nel caso in cui il codice utilizzi quasi tutta la RAM e non faccia uso della seriale. Evitando di compilare il supporto Serial si risparmierebbero 128 byte (vedi HardwareSerial.cpp, SERIAL_BUFFER_SIZE vale 64 nei processori con più di 1000 byte di RAM, come il 328, e ci sono due ring_buffer: uno di ricezione e uno di invio).
Nel caso della Mega si hanno 4 seriali, quindi 128 x 4 = 512 byte.
In entrambi i casi si tratta del 6,25% della RAM.
In particolare, nella MEGA se uno sketch ha bisogno di molta RAM ed usa solo una seriale (ad esempio), si ritrova con 3 x 128 byte inutilmente occupati.

Per quanto riguarda il discorso prestazionale io eliminerei la funzione serialEventRun.
Non mi pare così difficile (anche per chi è neofita) interiorizzare questo costrutto:

if (Serial.available() > 0) {
    char ch = Serial.read();
    // fai qualcosa con ch
}

Visto tra l'altro che usando serialEventRun la cosa si tradurrebbe in:

void serialEvent() {
    char ch = Serial.read();
    // fai qualcosa con ch
}

Guadagno ? Nullo. La stessa cosa la potrebbe scrivere l'utente.

Nel caso della MEGA, poi, usare la tecnica esplicita ed eliminare serialEventRun significherebbe automaticamente includere solo le chiamate ad available() per le porte seriali effettivamente utilizzate.

Per quanto riguarda la ram "sprecata" nel caso di porte seriali non utilizzate, in teoria basterebbe eliminare l'istanziazione automatica degli oggetti Serial1, Serial2, ecc. ma c'è un grosso ma: gli interrupt. Bisogna legare un particolare interrupt di ricezione seriale ad una particolare istanza di Serial. Non credo ci sia un modo alternativo di farlo rispetto a com'è scritto attualmente (o almeno su due piedi non riesco ad immaginarlo).