Delete rule on view does not execute every statement
Quote from the manual


  Caution
  
  In many cases, tasks that could be performed by rules on INSERT/UPDATE/DELETE are better done with triggers. Triggers are notationally a bit more complicated, but their semantics are much simpler to understand. 


(Emphasis mine)

I think this is one of the many cases where this is better done with a trigger:

create or replace function delete_reach() 
  returns trigger
as
$$
begin
  DELETE FROM reach
  WHERE reach.id = old.id;

  DELETE FROM rp
  WHERE rp.id = old.rp;
  return old;
end;  
$$
language plpgsql;

create trigger delete_reach_trigger 
   instead of delete 
   on vw_reach
   for each row
   execute procedure delete_reach();


Online example: https://rextester.com/KMEDTV61929