Quando você tem LIMIT e ORDER BY, o otimizador decidiu que é mais rápido fazer limp nos registros não filtrados em foo por chave descendente até obter cinco correspondências para o restante dos critérios. Nos outros casos, ele simplesmente executa a consulta como um loop aninhado e retorna todos os registros.
De cara, eu diria que o problema é que o PG não groca a junta distribuição dos vários ids e é por isso que o plano é tão sub-ótimo.
Para possíveis soluções:vou assumir que você executou ANALYZE recentemente. Se não, faça isso. Isso pode explicar por que seus tempos estimados são altos mesmo na versão que retorna rápido. Se o problema persistir, talvez execute ORDER BY como uma subseleção e coloque o LIMIT em uma consulta externa.