Esto se está complicando mucho. ¿No podrías publicar un ejemplo mínimo de todos los ficheros implicados?
Por lo que he entendido, quieres redirigir la petición a una página de entrada si el usuario no está registrado. Entonces, eso se hace en el CGI que ejecuta el usuario cuando entra en el web. El CGI se da cuenta de que el usuario no está autenticado, por lo que en lugar de presentar una página normal, hace un redirect() a la página que muestra el registro de entrada.
El navegador del usuario recibe el redirect() y lo ejecuta: carga otro URL, el del registro. El usuario se identifica, pulsa el botón y la petición la recibe el mismo CGI u otro, que almacena la sesión de ese usuario. Y le pasa el control al CGI principal, o manda por sí mismo un saludo al usuario, consistente en un HTML con un pequeño mensaje, pero con una cabecera Refresh, que le llevará al URL principal al cabo de unos segundos.
El CGI principal se ejecuta y muestra el contenido después de ver que el usuario sí que está autenticado.
Pero esto es una forma de hacerlo. Hay más...
Por otra parte... todo lo que sea ejecutar subrutinas entre códigos Perl, es algo completamente normal (de forma directa, heredada en forma de métodos, system(), qx(), do(), etc.), pero hay que recordar que toda esa ejecución forma parte de UNA sola petición del usuario. El usuario está esperando una respuesta.
Eso quiere decir que tu no puedes llamar a una subrutina de login(), esperar a que el usuario se identifique, y luego seguir con el programa principal. No puedes hacerlo porque ahí contamos al menos dos peticiones HTTP por parte del usuario.