Eu uso funções parcialmente como uma maneira de documentar o código. Chamar uma função com um nome significativo facilita a compreensão do código. Em alguns casos, mesmo uma função com uma única linha faz sentido.
Por exemplo, em "Código Limpo", Robert C. Martin dá o seguinte exemplo: Qual deles você prefere ver? Este:
// Check to see if the employee is eligible for full benefits
if ((employee.flags & HOURLY_FLAG) &&
(employee.age > 65))
Ou isto?
if (employee.isEligibleForFullBenefits())
Nem sempre eu concordo com ele, mas neste caso eu concordo. O código deve ser legível, não apenas quando você o escreve e conhece todos os detalhes, mas também às 21:00 quando você precisa corrigir erros no código de outra pessoa. Olhar para uma condição longa e tentar descobrir todos os negativos duplos não é recomendado. Se você pode simplesmente colocar um nome nele (não apenas as condições, mas todos os trechos de código que você escreve), isso se torna muito mais simples.
Nunca me arrependi de colocar algo em uma função e, se você estiver preocupado com o desempenho, faça um perfil primeiro.