So I checked, and Serial.available() should actually be pretty cheap:
int HardwareSerial::available(void) {
312: fc 01 movw r30, r24
return ((unsigned int)(SERIAL_RX_BUFFER_SIZE + _rx_buffer_head - _rx_buffer_tail)) % SERIAL_RX_BUFFER_SIZE;
314: 91 8d ldd r25, Z+25 ; 0x19
316: 22 8d ldd r18, Z+26 ; 0x1a
318: 89 2f mov r24, r25
31a: 90 e0 ldi r25, 0x00 ; 0
31c: 80 5c subi r24, 0xC0 ; 192
31e: 9f 4f sbci r25, 0xFF ; 255
320: 82 1b sub r24, r18
322: 91 09 sbc r25, r1
}
324: 8f 73 andi r24, 0x3F ; 63 (clever and fast "divide" !)
326: 99 27 eor r25, r25
328: 08 95 ret
:
:
while (Serial2.available() <= 0) {
a52: 85 ea ldi r24, 0xA5 ; 165
a54: 92 e0 ldi r25, 0x02 ; 2
a56: 5d dc rcall .-1862 ; 0x312 <HardwareSerial::available()>
a58: 18 16 cp r1, r24
a5a: 19 06 cpc r1, r25
a5c: d4 f7 brge .-12 ; 0xa52 <main+0x228>
a5e: 82 e4 ldi r24, 0x42 ; 66
continue;
}