So I attempted a couple methods to directly model buoyancy on surface vessel hulls, but they are computationally very challenging and cost a lot a framerate.
I figured out how to get the depth of exterior hull vertices in local coordinates using the vessel altitude and rotating from vessel coordinates to relative coordinates through pitch, roll, and yaw. That allows the pressure distribution on a surface to be determined, but things get ugly after that, particularly if the surface is semi-submerged. To integrate buoyant forces on the hull, you need to determine the net hydrostatic load and locate it at the center of pressure of only the submerged part of all the surfaces. This is possible but complicated to do in general. Even if this were done, this would produce a force vector on each surface where the magnitude AND location changes dynamically, and can change rather quickly, which quickly would punt you into space.
I also tried a point cloud method to integrate the volume and centroid of the submerged portions of the vessel in order to use Archimede's principle to determine the net buoyant force and its line of action. This works after a fashion, but even for a simple box it is very computationally expensive as you must perform this integration every time step, and in order to get accurate results you must count lots of points. Due to the granular nature of this model, you tend to get step changes in buoyant force as more points emerge/submerge, and again this causes fits with the propagators. Numerical underrelaxation helps somewhat with stability, but it causes the application of force to lag from the current state of the vessel, so too much underrelaxation leads to different instabilities. There really is no setting where the simulation is stable. The only way to "fix" this is to greatly increase the number of points in the point cloud, but that is murder on frame rate.