Giovanni Moreno debutó como profesional en el Envigado F. C. cuando este se encontraba en segunda división. Al año siguiente fue pieza fundamental del ascenso del club anaranjado, anotando 28 goles en todo el año (9 por el Torneo Apertura y 19 en el Finalización)[2] siendo el máximo goleador de los Torneos Apertura y Finalización del 2007 en la Primera B y llamando la atención de varios clubes nacionales e internacionales. En el primer semestre de 2008 estuvo cerca de llegar a Atlético Nacional, pero siguió en Envigado jugando 22 partidos y convirtiendo 10 goles. En el segundo semestre de ese año fue fichado por Atlético Nacional.
Atlético Nacional
Luego de su buen desempeño con el Envigado F. C., fue fichado por el Atlético Nacional por 2.5 millones de dólares. Gio se convirtió rápidamente en un referente e ídolo del club con el cual su buen desempeño lo llevó a ser el nuevo 10 de la Selección Colombia.
Después de su buen desempeño con el club verdolaga, y de sus reiterativas convocatorias a la Selección colombiana, llamó el interés de varios clubes extranjeros como Racing y River Plate, pero fue el primero quien se quedó con los servicios del jugador. Finalizó su paso por Atlético Nacional jugando 81 partidos y convirtiendo 44 goles, 10 goles en 14 partidos por la Copa Colombia y 34 goles en 67 partidos por Liga.
Racing Club
Su primera experiencia en el fútbol del exterior fue en el Racing de Argentina por 4.3 millones de dólares más un partido amistoso entre Racing y Atlético Nacional.
Su desempeño en Racing fue extraordinario durante su primera temporada, convirtiéndose en una de las grandes figuras del plantel del club de Avellaneda en su primer año, llevando a Racing hasta el 5° puesto en el torneo. Hasta que en el Torneo Clausura 2011, frente a All-Boys en la primera fecha sufrió una lesión de ligamento cruzado posterior en la rodilla que lo deja 8 meses inactivo, también dejándolo sin la posibilidad de participar en la Copa América 2011 realizada en Argentina.
Su regreso a las canchas fue, casualmente, frente a All-Boys en el Torneo Apertura 2011. En este torneo, Giovanni contó con el apoyo del nuevo técnico del club Diego Simeone (después de la renuncia de Miguel Ángel Russo por los malos resultados), volviendo a tener un puesto en el once titular y nuevamente volviéndose un jugador desequilibrante y determinante para el equipo. Racing formó un equipo competitivo y terminó como subcampeón del torneo detrás de Boca Juniors. Gracias a los buenos resultados del torneo, Racing obtuvo un cupo para la Copa Sudamericana 2012.
En el Torneo Clausura 2012, Después de perder frente a Independiente en el Clásico de Avellaneda, además de la destitución del técnico Alfio Basile y de la salida de su compatriota y goleador Teófilo Gutiérrez del club, hinchas del club amenazaron a los jugadores a tal punto que durante las semanas posteriores algunos jugadores, entre ellos Moreno, recibieron amenazas de muerte. Ya finalizando el torneo, unos hinchas armados se subieron al automóvil de Moreno, en el cual se encontraba junto con su compañero Federico Santander, y le apuntaron un revólver a la rodilla. Esto ocasionó la salida de Moreno del club hacia el fútbol chino para jugar en el Shanghai Shenhua. Su paso por Racing fue con 50 partidos en 2 años y 12 goles (11 goles por Liga en 47 partidos y 1 gol en 3 partidos de la Copa Argentina).
Luego de un semestre, donde convirtió 2 goles, por falta de pagos de su salarios estuvo cerca de ir al fútbol árabe en enero de 2013 aunque continuó jugando en el club chino durante el semestre. El 19 de agosto del 2015 marcó un gol de chilena en un empate 3 a 3 contra Shanghai SIPG por los cuartos de final de la Copa de China, donde terminarían clasificándose en los penales.[3] Marcó un doblete el 16 de octubre en el empate a dos goles de su club frente al Henan Jianye llegando a 10 goles en la temporada.[4]
Para el año 2017 recibió una oferta para jugar en Millonarios por parte del entrenador argentino Miguel Ángel Russo, aunque la declinó. En su primer partido de 2017 marcó un doblete en la goleada 4 a 0 de su club sobre el Jiangsu Suning, saliendo como la figura del partido. El 8 de julio marcó los dos goles del empate a dos goles frente a Jiangsu Suning en los últimos diez minutos llegando a 43 goles como máximo goleagor histórico de su club en liga. Volvió a marcar un doblete el 29 de julio, ayudando a remontar un 0-2 a un 3-2 frente al Hebei China Fortune.
El 26 de noviembre volvió a quedar campeón luego de 10 años, ganando la Copa de China de fútbol, su primer título en China. Ese día el Shanghái Shenhua perdió frente al Shanghái SIPG por 3-2 pero ganó en el global por el gol de visitantes tras haber ganado la ida 1-0. A pesar de haber marcado un autogol en este partido, Moreno cerró así la mejor temporada con el club anotando 15 goles en 32 partidos jugados.[5]
En el primer partido de 2018 marcó el gol del empate a un gol como visitantes frente a Kashima Antlers por la Liga de Campeones de la AFC 2018. El 7 de marzo volvió y marcó en el torneo, marcando de tiro penal el empate a un gol contra Suwon Bluewings. El 18 de marzo marcó su primer gol por Liga, dándole la victoria por la mínima al club en su visita a Guizhou Zhicheng. Le dio la victoria a su club nuevamente en el 1-0 sobre Dalian Yifang. El 28 de octubre marcó su último gol del año en el 4-2 como visitantes ante Tianjin Teda.
Su primer gol de 2019 lo hizo el 31 de marzo para darle la victoria a su club 2 por 1 como visitantes ante Henan Jianye. El 10 de mayo marcó el gol del empate a un gol como visitantes ante Tianjin Teda. El 21 de junio marcó el gol de la victoria por la mínima sobre Jiangsu Suning. Marcó su primer doblete del año en la goleada 5 por 2 contra Guangzhou R&F.
El 16 de diciembre renovó contrato por una temporada más con el Shanghái Shenhua, pero se desvinculó en enero de 2022.[6]
Segunda etapa en Atlético Nacional
La noche del 14 de enero de 2022 fue confirmado oficialmente como refuerzo de Atlético Nacional, siendo esta su segunda etapa en el club.[7] Cabe recordar que en 2018 estuvo cerca el regreso de Moreno, e incluso había sido anunciado por el club, pero diferencias económicas de última hora hicieron que se frustrara esa operación.[8] Su primer gol en esta segunda etapa fue el 15 de febrero de 2022 en la victoria 2-1 vs Envigado F.C.[9]
Retiro
Luego de protestar en contra del bajo salario de Hernán Herrera (entrenador de Atlético Nacional), que se vio como una falta de respeto al club, Giovanni Moreno fue despedido de Atlético Nacional luego de cumplir su sueño de ser campeón con el equipo que le dio experiencia y nivel. Al momento de su salida varios clubes, como Envigado FC, Junior de Barranquilla e Independiente Santa Fe,[1] intentaron fichar al jugador como agente libre, pero esto no resultó por las pretensiones económicas del jugador. Así, Moreno puso fin a su carrera deportiva el 19 de agosto de 2022[10]
Volvió a ser convocado a la selección Colombia el 30 de mayo de 2017 para los amistoso en territorio español frente a las selecciones de España y de Camerún.[13] El 7 de junio volvió a jugar con la selección nacional en el empate a dos goles frente a España, entrando en el minuto 64 por Edwin Cardona.
El 14 de mayo de 2018 fue incluido por el entrenador José Pekerman en la lista preliminar de 35 jugadores para disputar la Copa Mundial de Fútbol de 2018.[14] Finalmente fue descartado de los 23 jugadores que fueron a la cita mundialista.