Why does deleting a translation on my custom entity delete the entire record?
TL;DR: Extend ContentEntityDeleteForm instead of ContentEntityConfirmFormBase.

The solution was to pattern my approach after the way Node and Taxonomy Terms create their delete forms. I changed my delete form to extend ContentEntityDeleteForm instead of extending ContentEntityConfirmFormBase. Look at ContentEntityDeleteForm::submitForm

// Make sure that deleting a translation does not delete the whole entity.
if (!$entity-&gt;isDefaultTranslation()) {
  $untranslated_entity = $entity-&gt;getUntranslated();
  $untranslated_entity-&gt;removeTranslation($entity-&gt;language()-&gt;getId());
  $untranslated_entity-&gt;save();
  $form_state-&gt;setRedirectUrl($untranslated_entity-&gt;urlInfo('canonical'));
}
else {
  $entity-&gt;delete();
  $form_state-&gt;setRedirectUrl($this-&gt;getRedirectUrl());
}


It explicitly takes care not to delete the whole entity when you are deleting a translation.

ContentEntityConfirmFormBase inherits the ContentEntityForm::submitForm method, which in turn executes the EntityForm::submitForm method. The entity never gets deleted anywhere in that process. Thus, I needed to override the submitForm method in my class. I hadn't included the necessary logic to account for translations, though. Rather than reproducing the necessary logic in an overridden submitForm method, it made more sense to change the class that I was extending.