Hola @beatrizseller y @samuel_es, la explicación de @samuel_es es muy acertada. El problema con Tag::getTagsProducts() es que su estructura de retorno está pensada para listar etiquetas de múltiples productos o para el back-office, no para un consumo directo y simple en un product.tpl para un solo producto y el idioma actual.
Para obtener las etiquetas de un producto específico en el idioma de la tienda, necesitas un paso adicional de filtrado o usar una función más específica si existiera. En tu override del ProductController, en lugar de usar initContent (que puede ser muy temprano o chocar con otras inicializaciones), te sugiero usar un método como assignAttributesGroups o assignGeneralPurposeVariables que se ejecutan más tarde y tienen el contexto de producto ya establecido. Aquí te dejo una corrección para tu override que debería funcionar:
// En override/controllers/front/ProductController.php
class ProductController extends ProductControllerCore
{
public function assignGeneralPurposeVariables()
{
parent::assignGeneralPurposeVariables();
$id_product = (int)Tools::getValue('id_product');
$tags = Tag::getTagsProducts($id_product);
$formattedTags = [];
if (isset($tags[$id_product]) && is_array($tags[$id_product])) {
Con este código, $product_tags será un array simple de nombres de etiquetas (['tag1', 'tag2']), lo que te permitirá iterar en tu product.tpl así:
{if $product_tags}
<div class="product-tags">
<h5>Etiquetas:</h5>
{foreach from=$product_tags item=tag name=tags_loop}
<a href="{$link->getTagLink($tag)}" class="tag">{$tag}</a>{if not $smarty.foreach.tags_loop.last}, {/if}
{/foreach}
</div>
{/if}
Recuerda que modificar el core con overrides como este, aunque funcional, requiere atención en cada actualización de PrestaShop. Para una solución más robusta y sin preocupaciones por futuras actualizaciones, especialmente si buscas una automatización de mostrar etiquetas con más opciones de configuración, un módulo dedicado siempre será la mejor opción para tiendas en producción.