Grato amigo!
Usar um INNER JOIN deve melhorar a situação. E também não tem necessidade de GROUP BY aí.
SELECT tabela_clientes.nome,
tabela_clientes.cpf_cnpj,
tabela_clientes.endereco,
tabela_clientes.telefone,
tabela_clientes.codigo_cliente,
tabela_geracao.valor_mensalidade
FROM tabela_clientes
INNER JOIN tabela_geracao
ON tabela_clientes.codigo_cliente = tabela_geracao.codigo_cliente
WHERE tabela_geracao.codigo_cliente LIKE '%$data%'
AND tabela_geracao.bloqueado = 0
ORDER BY tabela_clientes.nome ASC
Quando se relaciona as tabelas da maneira que você fez, primeiro o MySQL vai fazer todas as combinações possíveis entre os registros e depois filtrar. Supondo que tabela_clientes tenha X registros e tabela_geracao tenha Y registros, primeiro ele monta X*Y registros e depois filtra pelo código. Usando o JOIN, na hora de relacionar os registros ele já filtra. Aí melhora o desempenho.
Era isso mesmo, muito obrigado!