Essa é uma dúvida que talvez seja de Javascript, eu fiz o curso de Angular 1, mas já faz tempo, lembro do uso do splice que pega o index do elemento e remove do array, mas não entendi direito porque no Angular 2 precisa de um novo array (se entendi direito) para atualizar a view. Já vi alguns exemplos, acho que até no curso de ES6 I, que você utilizou concat, sei que o map também gera uma cópia do array original, poderia usar uma dessas alternativas nesse caso? Já vi a utilização desse método slice, mas porque slice(0)?
let novasFotos = this.fotos.slice(0);
let indice = novasFotos.indexOf(foto);
novasFotos.splice(indice, 1);
this.fotos = novasFotos;
this.mensagem = "Foto removida com sucesso";