Obrigado pelo seu conselho! Caso optemos por excluir esses tópicos completamente, vou definir deleted_at e visible=false por meio de uma consulta SQL. Esses tópicos serão excluídos por um job do Sidekiq após 30 dias.
Mas, se esses tópicos devem ser mantidos, farei o que você sugeriu e “excluirei” eles por meio de um pequeno trecho de código Ruby usando topic.delete.
Assim, em ambos os casos, esses tópicos serão processados pelo próprio Discourse no final, o que deve cuidar de possíveis dependências.
Muito obrigado!