Direi che è abbastanza normale che impieghi qualche istante quando arriva un pacchetto dal client.
Il tuo client.read() ti restituisce solo i byte del get o il post che invii, ma in realtà ad arduino arriva più che un pacchetto uno scatolone ri roba tipo questo
User-Agent: Mozilla/5.0 (Linux; U; Android 4.0.3; it-it; Sensation_Z710e Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30
Accept: text/plain, */*
Accept-Language: it-it,it;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Referer: http://192.168.1.177/file.htm
Content-Length: 35
Pragma: no-cache
Cache-Control: no-cache
code: 200
handler: la tua stringa on/off eccetera GET o POST.....
il tutto passa dalla libreria w5100 rifacendo poi il percorso inverso per dire al client "ho ricevuto" costruendolo un altro pacco per poi rinviarlo al client.
La differenza sta nel fatto che il pc legge in un istante il pacchetto e risponde in tempi brevissimi,ma arduino è un 16Mhz ci mette più tempo a leggere e rispondere, a mio parere ci puoi fare ben poco se non passare a un chip più veloce.
Posso chiedere perchè ti serve un tempo minore di 20-30 ms?
ciao