As outras respostas fornecem conselhos amplos sobre o raciocínio de desempenho. Esta resposta trata especificamente de semântica não estrita.
Embora a preguiça torne mais difícil argumentar sobre desempenho, não é tão complicado quanto você imagina. Embora a preguiça seja bastante útil em algumas situações, na maioria das vezes uma linguagem preguiçosa é usada da mesma maneira que uma linguagem estrita seria usada. Conseqüentemente, o raciocínio de desempenho para idiomas estritos pode ser aplicado (com alguns ajustes) a idiomas preguiçosos.
Em termos de complexidade de tempo, a avaliação ávida faz estritamente mais trabalho do que a avaliação preguiçosa. Ambas as estratégias produzem o mesmo resultado na maioria dos casos. (Mais precisamente, se a avaliação ágil não apresentar erros, ela produzirá o mesmo resultado que a avaliação preguiçosa.) Portanto, para raciocinar sobre a complexidade de tempo de um programa Haskell, você pode fingir que ele avalia avidamente. Nas situações pouco frequentes em que a preguiça é importante, essa estimativa será muito alta e deve ser revisada para baixo.
Embora a avaliação preguiçosa ofereça menor complexidade de tempo do que a avaliação antecipada, às vezes oferece maior complexidade de espaço, ou seja, vazamentos de espaço. Maior complexidade de espaço pode ser corrigida adicionando anotações de rigidez para fazer com que um programa seja executado com mais entusiasmo. As ferramentas de criação de perfil são muito boas para rastrear a causa dos vazamentos de espaço. Eu categorizaria isso como depuração de correção ou depuração de desempenho, dependendo da gravidade.