Se as linhas estão sendo impressas com valores vazios para cada coluna, o problema pode ser que o formato da resposta não é igual ao que foi programado na view.  
Para validar isso, faça o seguinte teste no seu arquivo routes/produtos:
connection.query(sql, (err, data) => {
            if (err){
                console.log('houve um erro');
                console.log(err);
                return;
            }
            console.log(data);
            //Verificando o formato da resposta
            for(var i=0;i<data.length;i++) {
                console.log('Linha Produto ');
                console.log(i);
                console.log(data[i]);
                console.log('Campos Produto:');
                console.log(data[i].id);
                console.log(data[i].nome);
                console.log(data[i].descricao);
                console.log(data[i].valor);
            }
            res.render('produtos/lista', { lista: data });
            connection.close();
        });