But tail might read up to pipe buffer size more data than is actually required. Also tail + head approach have an overhead of copying data between processes.
That’s why tail | head isn’t a reliable way to seek an fd — it will seek past the desired offset by reading and then failing to write up to PIPEBUF bytes.