Note: I am using registry events instead of deferred registry so if someone chimes in on a difference that works better than listen to them. this method still works so i am yet to be motivated to change.
I am able to replace blocks using the RegistryEvent.Register<Block>.
I get the old resource location ForgeRegistries.BLOCKS.getKey(oldBlock); and set the custom block with that blocks registry location newBlock.setRegistryName(resourceLocation); ForgeRegistries.BLOCKS.register(newBlock);
I also replace the Item (again i dont know if this is still needed as doing so still works so i have yet to change it)