SO_KEEPALIVE option doesn't mean that your connection will live forever. It only enables keepalive probes. These probes are carried out to determine that your connection is still alive. Note, not for keeping it alive.
In FreeBSD by default net.inet.tcp.always_keepalive variable configured to assume SO_KEEPALIVE on all TCP connections. But first keepalive probe will be made only after 2 hours of idle state. This is controlled by net.inet.tcp.keepidle variable.
Just have tested keepalive probes with lowered idle time to 65 seconds on FreeBSD 12.0. All works as expected.