My code attempts to use DHCP, and if that fails, falls back to static IP address config. Ethernet.cpp stores a pointer to a DHCP struct, and doesn't clear that in subsequent begin() calls, so when you call maintain(), it attempts to renew the DHCP lease, blocking for the timeout (default 60 s). This makes it impossible to handle network requests.
The manual begin() calls should set _dhcp = nullptr.