Seu primeiro cenário, se aplica para reinventar a roda, é auto-explicativa.
O segundo cenário, NÃO se aplica se o código existente exigir pouca modificação, mas se for o caso, é uma boa ideia tentar usar propriedades, métodos e uso semelhantes aos de um código existente, para que outros desenvolvedores não tenham problemas ao usar o seu "roda".
Tenha cuidado com a abordagem "é sempre melhor começar do scrath", pois pode levar mais tempo do que o esperado.
O terceiro cenário mencionado, é a abordagem "prática". A "roda dada" pode fazer o trabalho, mas, na realidade, consome muitos recursos, memória, velocidade, etc.
Trabalhei uma vez em um aplicativo que exige mostrar dados hierárquicos em um controle de árvore em uma única tabela. Já temos um controle que poderia fazer isso, mas suportamos várias tabelas por item.
Para usá-lo, tive que aprender muitas coisas, atribuir muitas propriedades, executar muitos métodos, e FOI LENTO. Um colega de trabalho insistiu em usá-lo, a fim de "não reinventar a roda".
Eu fiz um novo controle, a partir do zero, li uma única tabela, programe apenas algumas propriedades fáceis de aprender. E antes que eu percebesse, havia outro colega de trabalho que o retirou do repositório de código compartilhado e substituiu o controle anterior.
Bônus:
Quando a roda que você já possui é "ao quadrado". Por "quadrado", quero dizer que, na superfície, parece que parece uma solução para o seu problema, mas depois de uma boa olhada, você chega à conclusão de que não.
Depende se você possui as habilidades e o tempo (e a autorização da sua empresa) para reinventar a roda.