First off, I was able to confirm that gather stats does indeed finish successfully by running:
select * from v$session_longops where opname like '%Schema%' order by start_time desc;
After that I ran the following tcpdump commands on both servers:
tcpdump -i eth0 -A "(src <myipaddress> or src <myoracle19caddress> or dst <myipaddress> or dst <myoracle19caddress>) and not port ssh and not port openvpn and not icmp" (OpenVPN Server)
tcpdump -i eth0 -A "(src <myipaddress> or src <myopenvpnserveraddress> or dst <myipaddress> or dst <myopenvpnserveraddress>) and not port ssh and not icmp" (Oracle 19c Server)
And discovered that the Oracle 19c server did send the success message, but the OpenVPN server never received it.
After some digging around on various sites, I found out that I misunderstood what net.ipv4.tcp_keepalive_time actually does.
This means that [by default] the keepalive routines wait for two hours (7200 secs)
before sending the first keepalive probe, and then resend it every 75
seconds.
After that I found out about a network configuration of the cloud provider where I have my OpenVPN server hosted.
Idle connections
[...] implement 10-minute connection tracking for
IP protocols that have a concept of a connection.
This means that inbound packets associated with an established
connection are permitted as long as at least one packet is sent or
received for the connection within the last 10 minutes. If no packets
for the connection have been sent or received for 10 minutes or
longer, the idle connection's tracking entries are removed. After the
connection's tracking entries have been removed, [...] does not
permit additional inbound packets until at least one new outbound
packet has been sent. This connection tracking applies to all sources
and destinations – both internal and external IP addresses.
With this new information I got around this limitation by setting the keepalive time to a value inferior than 10 minutes by running the following command on the Oracle 19c server:
sysctl -w net.ipv4.tcp_keepalive_time=300 net.ipv4.tcp_keepalive_intvl=60 net.ipv4.tcp_keepalive_probes=5
And made these changes permanent by saving them to /etc/sysctl.conf.
Finally, SQL Developer receives the success message and closes the connection.