The semantics around close() are as they are not because of issues around exit, but because of shared descriptors.
Calls that duplicate descriptors such as fork() or dup() will result in multiple descriptors which refer to the same network socket. These sockets need to be able to be closed individually via close() without actually shutting down the socket or modifying the socket state.
If close() terminated a connection ala shutdown() then it would be impossible for a process with a network socket to fork a temporary subprocess.
A different call is necessary to indicate that you wish to terminate the underlying network socket state.