The NPE is (as the error says) because you can't pass null to compareTo. And $opportunity.Pipeline_Notification_Date__c can be null.
While you may not have been expecting null there, why are you using .compareTo(other) == 0 instead of .equals(other)? The former will throw on null, while the latter is a valid method call (it will return false if the argument is null).
And for your purposes, if you want to check equality between 2 native Strings, there's no reason not to use .equals().
You only need to use .compareTo() if your objects don't have specialized .equals() logic coded in -- or you don't like either side's .equals() method for some reason -- but the objects do have specialized sorting logic you want to reuse. (In Java-speak, an object that has different rules for sorting and for equality is said to have "ordering inconsistent with equals" and you want to avoid this whenever possible anyway.)
P.S. Looks like you're also mixing up the timezone-d dates and the built-in $date in various places, which means your comparisons can be off (remember that dates that are parsed in different timezones will be different dates for between 1 and 23 hours).