Pruebalo de esta forma: 
   
Código sql:
Ver original- DELIMITER $$ 
-   
- DROP PROCEDURE IF EXISTS `rrserver`.`Informe Agentes`$$ 
-   
- CREATE PROCEDURE `Informe Agentes`( 
-   inicio    datetime, 
-   fin       datetime, 
-   vestado    VARCHAR(15), 
-   empleador VARCHAR(20), 
-   vcargo     VARCHAR(15)) 
- BEGIN 
-   SELECT 
-     u.nombreapellido NOMBRE, 
-     u.portalid USERPORTAL, 
-     m.tipo_turno `TIPO TURNO`, 
-     SUM(IF(c.numero_consulta IS NULL, 0, 1)) `CONSULTAS`, 
-     SUM(IF(b.usuario_ingreso IS NULL, 0, 1)) `BOLETAS`, 
-     SUM(IF(r.numero_requerimiento IS NULL, 0, 1)) `REQUERIMIENTOS`, 
-     SUM(IF(t.recibido IS NULL, 0, 1)) `LLAMADAS` 
-   FROM rrserver.usuarios u 
-     INNER JOIN monitoreo.agentes m USING(userid) 
-     LEFT JOIN portalreflex.consultas c ON c.usuario_ingreso = u.portalid 
-     LEFT JOIN portalreflex.requerimientos r ON r.usuario_ingreso = u.portalid 
-     LEFT JOIN rrserver.agente_15minutos t ON 
-   WHERE 
-     m.estado LIKE vestado AND 
-     m.empleador_agente LIKE  empleador AND 
-     m.cargo LIKE vcargo 
-   GROUP BY u.userid 
-   ORDER BY u.nombreapellido ASC; 
- END$$ 
-   
- DELIMITER ; 
El problema que tienes es que cada subconsulta en el SELECT se ejecuta una vez por cada campo y por cada registro, de modo que si tienes 5000 registros, esos select corren 20.000 veces en una sola ejecución. No es eficiente. 
Tips: 
1. No pongas los mismos nombres en las variables que en los campos que usas. Esto puede confundir al parser de MySQL y dar lugar a errores porque MySQL prioriza los campos y las tablas por sobre las variables.
2. La respuesta a tu pregunta del código está en :
 Nuevo resaltador de código Geishi - Foros del Web