I just noticed an older thread where you mentioned the same issue, and you resolved it by rebooting pfsense.
So you have seen this before and a while ago as well.
https://forum.kitz.co.uk/index.php/topic,22642.msg385726.html#newBut before I hit submit I see you have resolved it, so my theory was correct, but it would seem there is a bug pfsense side tho if its misreporting a 10mbit ethernet negotiation as 100/1000mbit.
If it happens again, the way to reset without a reboot would probably be to manually switch the mode of the ports. So e.g. to 100mbit half duplex and then back again.
If it happens again please login to the shell on pfsense and run the 'ifconfig' command with no arguments, I want to see if that outputs the correct negotiation.
As a possible permanent fix I was going to suggest disabling ethernet power saving on the zyxel but there seems to be no option, given the low power requirements in place now days for consumer devices, I expect there is power saving enabled but sadly doesnt seem to be configurable.
--edit--
On my older zyxel power management is configurable, if it is on yours disable it for the ethernet ports.
An option might be a 8800nl revision 1, these perform very well as modems, the power saving can be configured on a granular level and in addition each ethernet port's negotiation as well.