Entendo.
Dando uma olhada na documentação de remoção realmente parece ser inflexivel nesse ponto:
In order to delete an object from the database it has to first be retrieved (no matter which way) and then in an active transaction, it can be deleted using the remove method.
An IllegalArgumentException is thrown by remove if the argument is not a an instance of an entity class or if it is a detached entity.
Ou seja, precisamos resgatar a entidade de qualquer forma para que o remove seja executado sem lançar uma exception.
De qualquer forma, você pode executar essa query manualmente . Entretanto, para casos mais complexos nos quais sua entidade tenha relacionamentos com outras entidades (1x1, 1xN ou NxN), essa abordagem pode se tornar bem maçante.
Quanto a sua preocupação:
á que ao invés de gerar uma operação no banco, foram geradas 2 operações, e, em uma exclusão em massa isso seria ruim.
No caso de uma exclusão em massa, acredito que a melhor abordagem seja criar uma query para isso, apontando qual caso especifico você quer excluir.
Mas, mesmo que criar uma query na mão não seja uma opção, se você está excluindo uma entidade é porque ja visualizou ela antes e existe o sistema de cache para segurar esse tipo de requisição duplicada. O problema não seria tão grave mesmo varrendo uma lista para remover todas as entidades contidas.
Criar a query na mão seria dizer para o entitymanager que você sabe que aquele id existe no banco e que não há nenhum relacionamento com outras entidades naquele processo de remoção. Fazer o find é, muito provavelmente, pegar uma entidade que já está cacheada e mandar remover.