On my Pixel 8, stock seems to offer better battery life compared to GrapheneOS, with a mean SOT of 06:51 on stock, versus a mean SOT of 06:03 on GOS.
I can't be sure where the difference in battery life is coming from, but it may be due to stock's adaptive battery function that is not available on GOS.
However, the slight increase in battery life on stock is not worth the amazing privacy and security benefits that GOS provides over stock, so I will be sticking to GOS.
Context
I wrote a similar post to this one based on the tracking and analysis I did while I tested out stock Android before switching to GrapheneOS (Lemmy), and I wanted to complete my battery tracking by also seeing how GOS battery life compares to stock Android.
Similar to my testing while on stock, I used my phone as normal on GOS, with the below configurations:
LTE only (I don't have a 5G plan)
120hz refresh rate
Owner user, with separate work profile managed by Shelter
Sandboxed Google Play Services enabled for both main profile and work profile on the owner account
Dark mode
Bluetooth on, always connected to my Galaxy Watch 6 Classic and very often connected to other BT audio devices
With the above configurations, I used the phone normally, then took screenshots once I got the low battery warning notification at 20%. I started including the screenshots for the per-systems screen after seeing that the SYSTEM (IDLE) stats would be useful to track, but since I only have these datapoints for 11 charging cycles on GOS, I've excluded them from the analysis, although I am including the per-systems battery usage screen for reference.
Personal usage patterns & use-case
I try to achieve a balance between privacy and convenience, so I am using Sandboxed Google Play Services and only use one user. However, I minimize unnecessary permissions and try to install only FOSS apps on my main profile while installing as many proprietary apps into my work profile as possible.
The way I used my phone across stock Android and GOS was quite similar, although I did try to take advantage of GOS features whenever possible, such as enabling memory tagging, toggling off network permissions for apps that don't need them, etc.
Depending on your privacy threat model, you can use a more strict setup without sandboxed Google Play Services, which may actually decrease battery life due to constantly active web sockets, or you may use multiple users to compartmentalize different apps into different profiles, which may save more battery versus my compartmentalization via Shelter.
Notable observations
Although I got less SOT in general using GOS, I was still able to push the SOT past 9 hours with an idle time of 26:58 on my heaviest day (link), which is amazing battery life.
Streaming music on Spotify seems to be a huge battery hog, and other Pixel users have noticed the same (link). The worst SOT I got, which was 02:13, seems to be largely due to at least an hour of music streaming on Spotify.
On a related note, the background time tracking of Spotify is unreliable, as there were days when I was streaming music for about an hour (link), which led to a 10% battery decrease, but the battery usage screen says Spotify was active in the background for less than a minute (link).
You say you stick to open source, do you happen to block your messenger apps from using Play Services? I know from experience the fallback notification delivery mechanisms of a lot of apps will keep the radio on for much longer than it would be with Google Play Services, so I wonder if that could make up for some of the difference.
Nothing is blocked from using Play Services on my device. The biggest reason of me using sandboxed Google Play Services was actually to eliminate excessive battery drain from constantly open web sockets, since I also had a terrible experience with battery drain when using Lineage without GApps.