Which method is more efficient, database query or taxonomy term controller?
Do you need to load all of the children? Otherwise, loadChildren() will be performing the same query but also loading the full term -- which is a performance dent. The API on the entity storage won't make much of a difference here, honestly.

Have you looked at https://www.drupal.org/project/taxonomy_term_depth? This would be more performant. It caches the depth level in a new base field. If a term's depth is greater than one, you know it is a child.

I would even borrow the concepts from taxonomy_term_depth to add a new base field that is a boolean which caches if the term has children or not. That way you only need to work with the current term entity.