Dudo que in_array() haga que tu script se relentice apenas algo apreciable.
Por otro lado tu idea principal no creo que el problema sea que no te elimina los "+".
Si tu cadena esta: "esto+es+una+cadena+de+texto", supongo que quieres que te quite ("es","de","con") quedando este resultado
Código PHP:
Ver original$cadena_nueva = "esto+una+cadena+texto"
pues te ha quitado las coincidencias con "es","de","con", pero tu resultado no es ese. pues te imprime
en vez de
y aunque te quitemos los + de sobra no quedará con lo que supongo que esperas.
Sigo pensando que la mejor opción es que pases la cadena a un array, compares por medio de in_array(), si existe en el array, aplicas un unset() a ese elemento y lo eliminas del array, luego lo vuelves a pasar a una string por implode y tienes tu cadena de nuevo, y sin + de sobra