Pesquisando, a resposta popular parece ser "apenas desligue o modo de segurança" :
SET SQL_SAFE_UPDATES = 0;
DELETE FROM instructor WHERE salary BETWEEN 13000 AND 15000;
SET SQL_SAFE_UPDATES = 1;
Para ser sincero, não posso dizer que criei o hábito de correr no modo de segurança. Ainda assim, não estou totalmente confortável com essa resposta, pois ela apenas pressupõe que você deve alterar a configuração do banco de dados toda vez que tiver um problema.
Portanto, sua segunda consulta está mais perto do alvo, mas acerta outro problema: o MySQL aplica algumas restrições às subconsultas e uma delas é que você não pode modificar uma tabela enquanto seleciona dela em uma subconsulta.
Citando o manual do MySQL, Restrições em subconsultas :
Em geral, você não pode modificar uma tabela e selecionar da mesma tabela em uma subconsulta. Por exemplo, esta limitação se aplica a declarações das seguintes formas:
DELETE FROM t WHERE ... (SELECT ... FROM t ...);
UPDATE t ... WHERE col = (SELECT ... FROM t ...);
{INSERT|REPLACE} INTO t (SELECT ... FROM t ...);
Exceção: a proibição anterior não se aplica se você estiver usando uma subconsulta para a tabela modificada na cláusula FROM. Exemplo:
UPDATE t ... WHERE col = (SELECT * FROM (SELECT ... FROM t...) AS _t ...);
Aqui, o resultado da subconsulta na cláusula FROM é armazenado como uma tabela temporária, de forma que as linhas relevantes em t já tenham sido selecionadas no momento em que ocorre a atualização em t.
Essa última parte é a sua resposta. Selecione os IDs de destino em uma tabela temporária e exclua fazendo referência aos IDs nessa tabela:
DELETE FROM instructor WHERE id IN (
SELECT temp.id FROM (
SELECT id FROM instructor WHERE salary BETWEEN 13000 AND 15000
) AS temp
);
Demonstração do SQLFiddle .