It sounds like you understand there is no real difference in meaning between examples 1 & 2 - 'have been teaching' and 'have taught' - and you'd be correct. These are both idiomatic ways to talk about the work of a teacher.
Technically, the difference between 3 & 4 is the same and I agree they seem comparable to examples 1 & 2 - yet example 4 does sound slightly off to a native British speaker. As I said, "I have taught" is an idiomatic way of saying you have 'worked as a teacher'. It carries a recognised meaning that does not apply to other job roles based on verbs - for example, engineers do not say "I have engineered for 20 years", nor do firefighters say "I have fire-fought for 20 years". So, what is correct and natural in examples 1 & 2 doesn't automatically carry over to other verbs and contexts.
In the example of the reading, "have been reading for 3 hours" nicely conveys that you have been continuously engaged in reading for that length of time. The word "read" by itself (ie "I will have read for 3 hours") sounds okay, too. But "read this book for 3 hours" doesn't sound natural in this context. The past participle doesn't seem to convey the meaning that you have been engaged in reading until the time was up.