??????????????

E' giusto.

date(); utilizza il fuso locale, il tuo server risiede nella fascia oraria +1 ora, quindi risiede sullo stesso fuso orario di Roma / Berlino.

gmdate(); invece forza la visualizzazione dell'orario di "greenwich mean time", cioè del meridiano di Greenwick. Chiaramente se noi (a Roma/Berlino) siamo +01:00 (un'ora in avanti) loro sono naturalmente un'ora indietro rispetto a noi, ovvero sullo 00:00.

Se poi chiedi il fuso orario su Greenwich... beh il fuso orario è sempre +00:00, poichè il fuso orario si calcola proprio a partire dal meridiano di Greenwich.

GMT = greenwich mean time.

Ora italiana: 21:51 (con il fuso di +01:00 rispetto al GMT)
Ora del GMT: 20:51 (con il fuso di +00:00 rispetto al GMT - cioè se stesso).

Nota bene che in php la funzione gmdate non calcola mai il fuso ma restituisce a prescindere 0 giacchè il gmdate è già sul GMT (questa nota la puoi leggere sulla guida).