If you're absolutely sure there is no session on the remote end, then yeah, things are more complicated.
Some things to try:
1) Add session auditing ("audit session") to the username on the remote database, so you can track when the db link connection comes in, and if it terminates abnormally versus you getting a 'logoff' record in the audit trail. Because it seems very strange to have a session "disappear" (as opposed to normally exit) without any record of it on the remote node.
2) Keep an eye on the following stats for the initiating session:
SQL*Net roundtrips to/from dblink
bytes received via SQL*Net from dblink
to see if there is any pattern to the volume/frequency of calls.
3) Regarding your '3','4' points above, I've used both techniques in the past when talking to heterogeneous services, where you're at the whim of a number of layers in the conversation (eg, dblink => HS => ODBC => something else etc etc)
4) Have you tried *without* any dead connection detection set ? (I'm just just wondering if that's interfering with normal processing in an unexpeted way)
5) Upgrade :-)
Things have been revamped a little in 12c as per the whitepaper below, but I'll concede that's a fairly large step :-)
https://www.oracle.com/docs/tech/database/oraclenetdcd.pdf Hope this helps.