Perhaps a real life example of why using a BeanPostProcessor instead of @PostContruct will help.
I had been working on a Java cache library, and it used annotations such as @Cached, @UpdatesCache, @InvalidatesCache etc. The user (i.e. developer) should only need to annotate Java Methods with these annotations, and the rest should be taken care of by our library.
The Spring integration of the library had to make an extensive use of Spring Interceptors and BeanPostProcessor for that purpose.
Suppose a user annotates a Method A in a spring bean as @Cached(cacheName="myCache"). We should initialize a cache for that method A before it was ever called.
Using a BeanPostProcessor to initialize the cache was a solution to the problem: we did not want the user to have to write a @PostContruct method. The annotation should suffice.
TLDR, @PostContruct is for intercepting your own Beans post-construction, whereas BeanPostProcessor is for intercepting someone else's without them noticing.