Its one of those things, it "just is" :-)
new and old values are akin to bind variables, so just like you cannot do:
execute immediate 'delete from emp where empno = p_my_plsql_variable';
you can't do the same with new/old.
You can treat them like binds hence
execute immediate 'delete from emp where empno = :b1' using :new.empno;
eg
SQL> create table t ( x int );
Table created.
SQL> create or replace
2 trigger trg
3 before insert on t
4 for each row
5 declare
6 v int;
7 begin
8 execute immediate 'select count(*) from emp where empno = :b1' using :new.x;
9 end;
10 /
Trigger created.