For example, what do we need NOTE_INSN_BASIC_BLOCK for when there is already a pointer to the basic block structure in every insn? The only reason is that in olden_times, things were different and the whole CFG infrasturcture was build on basic block notes.
Unfortunately, GCC developers think it is OK to add new code without removing the cruft it replaces. So where the patch that introduced the basic block pointer in each insn should also have taken out the now-redundant NOTE_INSN_BASIC_BLOCK, it is still there, waiting for a capable volunteer to clean them up.
The same is true for most other insn notes.