Recent versions of VSPAERO / OpenVSP support an adjoint driven optimization capability. While this capability is not yet integrated into the GUI for mainstream use, it is possible for a motivated user to play with it now.
This capability was discussed at the 2025 OpenVSP Workshop (videos online), but is otherwise undocumented.
I've pulled together an example case and posted the files on the OpenVSP Wiki. Hopefully this will reduce frustration and help people start playing with this tool.
https://openvsp.org/wiki/doku.php?id=vspaero_opt