Your timezone doesn't change during daylight savings.

The rules that tell me what the time is in my timezone change, so the offset returned by $asctime (which is explicitly an offset from GMT) should change too. Wikipedia agrees with me on this.

In my opinion it is pretty obvious that if $asctime returns "20:00:00 +0100 GMT" and doing the math does not give me the current time in GMT then it is wrong.

$gmt is also faulty as it does not return GMT at all, but rather GMT + $daylight.

This is due to the fact that the offset doesn't necessarily have to be 1 hour (it could be 30 minutes, or 2 hours, or any other number in theory)

That's not relevant - your offset can still be a multiple of 30 minutes regardless of your current daylight saving offset.