When deleting a large fraction of the rows from a table, it's generally best to change the process to DDL. For example, create-table-as-select, filtered table move, etc. I cover these in detail at:
https://blogs.oracle.com/sql/post/how-to-delete-millions-of-rows-fast-with-sql This tends not to work with daily deletion though. Although you're removing millions of rows each time, it's generally a small fraction of the table.
In this case, the best option is to partition the table. Then remove the oldest rows by truncating or dropping the oldest partition.
I covered this in detail in last month's SQL Office Hours: