Structure for "sorting-only"
I haven't tried the approach that you are thinking of yet, but your concerns regarding the query count are not that unfounded. You would need to use the relatedTo()
parameter with the ElementCriteriaModel you create on your pages (to get the single's content)
on your navigation include (even if you only want to get the entries URL) and relations can have a rather big performance hit. Hopefully this is not true for a simple relation like this; otherwise, you'd still have the cache
tag. But I'd suggest you to cache the whole include (this is a perfect example for caching being really useful). Additionally setting the limit to '1' will probably help to keep the query count low if the cache is cleared.
{% cache for 3 years %}
{% set pages = craft.entries.section('pagesSectionHandle').level(1) %}
{% for page in pages %}
{% set params = {
relatedTo: { sourceElement: page, field: "entriesFieldHandle" },
limit: '1'
} %}
{% set linkedEntry = craft.entries(params).first() %}
{# Get the title from the structure (why set this twice?) #}
<a href="{{ linkedEntry.url }}">{{ page.title }}</a>
{# Get the title from the entry #}
<a href="{{ linkedEntry.url }}">{{ linkedEntry.title }}</a>
{% endfor %}
{% endcache %}
Structure containing "all the content"
What I'd suggest you to do is to not only use the structure as a "sorting only" structure, but to also add content directly to it.
Use entry types for your singles, if you need to load individual templates for them, and further entry types for your channel index pages. If it's thought-out carefully (modular site design) you probably won't end up with lots of entry types.
Combining those two
If you have a need to link to specific channel entries from your navigation, you could make an entry type in your structure specifically for those links to channel entries. All other content could still be added directly to the structure itself as described above.
I think that being able to edit the content directly in the pages structure is a very convenient and less geeky like experience for the client.
Edit:
This is what Naboovalley and I came up with in the chat (we should have done this before spamming the comments section). It "will give you a fully dynamic menu for your client linking between Singles, Channels and even other Structure entries":
{% cache globally for 3 years %}
{% set entries = craft.entries.section('navigation') %}
<ul>
{% nav entry in entries %}
<li>
{# Check for entry type / get related entry #}
{% if entry.type == 'linkedChannelEntry' %}
{% set linkedEntry = entry.entriesField.limit(1).first() %}
{% endif %}
{% if linkedEntry %}
{# Link to a linked channel entry #}
<a href="{{ linkedEntry.url }}">{{ linkedEntry.title }}</a>
{% else %}
{# Link to a structure entry #}
<a href="{{ entry.url }}">{{ entry.title }}</a>
{% endif %}
{# Repeat this for child entries #}
{% ifchildren %}
<ul>{% children %}</ul>
{% endifchildren %}
</li>
{% endnav %}
</ul>
{% endcache %}
{% nav %}
part worked in (even if the "run the relations query in the{% nav %}
loop" idea was yours)!