Why do I get a "page not found" error? I have a working page listing items in a block (created by the 'block_view' hook) which when displayed link to another set of pages where I want to list content types associated with them. The items are not standard drupal types so there is no relation between these two sets except through my DB table.

So say I have a link on the original page to mysite/speech/3, and I want to see all speeches associated with speech 3.
To do this I created a block, made it display on speech/* and all is good. I can see the content types associated with speech 3 in a nice table, except it also displays a 'Page not found error' along with the correct data.


Why?  
I'm trying to use the Drupal structure as far as possible where I can. When I can't are there issues with using blocks extensively performance wise?
You don't have a piece of content at that URL mysite/speech/3, only a block. Don't use a block in this situation, just use a regular page. 
Blocks are fine if you can cache them. Does the data change often? If not, set a very long cache and there should very little performance impact.