Vou levar essa pergunta do ponto de vista da modelagem.
Contanto que você não adicione nenhum relacionamento que não esteja realmente lá, você estará seguro. Se você adicioná-los, obterá menos integridade nos dados (porque há uma redundância) e um código mais fortemente acoplado.
A coisa com as referências circulares especificamente é que eu não vi um caso em que elas seriam realmente necessárias, exceto uma referência própria. Se você modelar árvores ou gráficos, precisará disso e está perfeitamente certo, porque a auto-referência é inofensiva do ponto de vista da qualidade do código (sem dependência adicionada).
Acredito que, no momento em que você começa a precisar de uma referência que não seja auto, você deve perguntar imediatamente se não pode modelá-lo como um gráfico (recolher as várias entidades em um nó). Talvez exista um caso no qual você faça uma referência circular, mas modelá-la como gráfico não é apropriado, mas duvido muito disso.
Existe o perigo de as pessoas pensarem que precisam de uma referência circular, mas na verdade não precisam. O caso mais comum é "O-um-de-muitos". Por exemplo, você tem um cliente com vários endereços dos quais um deve ser marcado como o endereço principal. É muito tentador modelar essa situação como dois relacionamentos separados has_address e is_primary_address_of, mas não está correto. O motivo é que ser o endereço principal não é um relacionamento separado entre usuários e endereços, mas sim um atributo do relacionamento que possui endereço. Por que é que? Porque seu domínio é limitado aos endereços do usuário e não a todos os endereços existentes. Você escolhe um dos links e o marca como o mais forte (primário).
(Agora vamos falar sobre bancos de dados) Muitas pessoas optam pela solução de dois relacionamentos porque entendem "primário" como um ponteiro exclusivo e uma chave estrangeira é um tipo de ponteiro. Então, chave estrangeira deve ser a melhor opção, certo? Errado. Chaves estrangeiras representam relacionamentos, mas "primário" não é um relacionamento. É um caso degenerado de uma ordem em que um elemento está acima de tudo e o restante não está ordenado. Se você precisasse modelar um pedido total, certamente o consideraria como um atributo de relacionamento, porque basicamente não há outra opção. Mas no momento em que você o degenerou, há uma escolha bastante horrível - modelar algo que não é um relacionamento como um relacionamento. Então aqui vem - redundância de relacionamento que certamente não é algo a ser subestimado.
Portanto, eu não permitiria que uma referência circular ocorresse, a menos que seja absolutamente claro que ela vem da coisa que estou modelando.
(nota: isso é um pouco tendencioso para o design do banco de dados, mas aposto que também é aplicável a outras áreas)