So I finally solved this. I narrowed it down to this code on LevelActor.cpp that was returning false in DestoryActor(). I could not figure out why.
const bool bCanDestroyNonNetworkActor = !!CVarAllowDestroyNonNetworkActors.GetValueOnAnyThread();
if (!bIsNetworkedActor && !bCanDestroyNonNetworkActor)
{
return false;
}
So I set about adding one section of code back at a time in a fresh class until I got it to fail in the same way. It had something to do with BeginPlay(). Once I removed beginplay() it worked as expected. Luckily I don’t need it there. Somehow BeginPlay() was flipping a bit in CVarAllowDestroyNonNetworkActors, and causing DestroyActor() to return false. Sucked.