Hola @nuria_tienda, el problema que describes es clásico de la gestión de caché de Smarty en PrestaShop 1.7.4.0. Como bien apuntan @paula_sevilla y @miriam_9651, es fundamental que, mientras desarrollas, actives la opción 'Forzar compilación' para las plantillas en Parámetros Avanzados > Rendimiento. Una vez que tus cambios funcionen, puedes volver a 'Recompilar las plantillas si han sido actualizadas'.
Respecto al código, el enfoque de iterar sobre $product.features es correcto, siempre y cuando las características estén correctamente asignadas y visibles en el contexto del producto. Para asegurarte de que tus insignias se muestren de forma fiable, puedes usar algo como esto en tu product.tpl de tu tema hijo, dentro del contenedor product-thumbnail o donde mejor te parezca visualmente:
{if $product.id_product}
{assign var="features_map" value=$product.features|array_column:'value' index:'name'}
{if isset($features_map['Promoción']) && $features_map['Promoción'] == 'Bestseller'}
<span class="product-badge bestseller">¡Más Vendido!</span>
{/if}
{if isset($features_map['Etiqueta']) && $features_map['Etiqueta'] == 'Eco'}
<span class="product-badge eco">Producto Eco</span>
{/if}
{/if}
Aquí, primero creamos un mapa de las características para acceder a ellas directamente por nombre, lo cual es más limpio que un foreach para cada condición. Esto asume que tienes características llamadas 'Promoción' y 'Etiqueta'. Ajusta los nombres de las características (Promoción, Etiqueta) y los valores (Bestseller, Eco) según los que hayas configurado en tu Back Office. Asegúrate también de que tu CSS para .product-badge, .bestseller y .eco esté definido en tu custom.css del tema hijo para darles el estilo deseado.