There is a very easy fix for all of this general/flag officer personal misconduct but, sadly, it will never be implemented.
If a GO/FO gets cashiered for personal misconduct, the service should lose that GO/FO billet for 3 years.
With this, you know that shit would get fixed literally overnight. Screening and selection would instantly double in rigor.
Afterall, maintaining GO/FO billets is are among the services' highest priorities...