Your Android need not to have root access for truly disabling an app, if you've version 4.4.x or above.  All you need is [tag:adb] setup in PC and [USB debugging enabled](https://android.stackexchange.com/tags/usb-debugging/info) in a non-rooted device or a terminal emulator app for a rooted device (you can use adb too).

If you check Package Manger's ([`pm`](http://developer.android.com/tools/help/shell.html#pm)) usage, you would see

<pre>pm block [--user USER_ID] PACKAGE_OR_COMPONENT")
pm unblock [--user USER_ID] PACKAGE_OR_COMPONENT")</pre>

For Lollipop, it would be

<pre>pm hide [--user USER_ID] PACKAGE_OR_COMPONENT")
pm unhide [--user USER_ID] PACKAGE_OR_COMPONENT")</pre>

In order to block or hide a package (it is safe), simply do 

    pm block PACKAGE # for KitKat
    pm hide PACKAGE # for Lollipop

To unblock or unhide the package, do

    pm unblock PACKAGE #for KitKat 
    pm unhide PACKAGE  # for Lollipop

`PACKAGE` &rarr; package name of an app. To know the package name of an app:

* For KitKat and below, follow http://android.stackexchange.com/q/28767/96277 
* For Lollipop, open Settings &rarr; Apps &rarr; All apps &rarr;  *your app* &rarr; click [here](https://i.sstatic.net/uYXnZ.png)

The function behind *hide* has the following comment [inside the source code](https://github.com/android/platform_frameworks_base/blob/marshmallow-release/core/java/android/content/pm/PackageManager.java#L4334 "first suggested by Andrew T.")

> Puts the package in a hidden state, which is almost like an uninstalled state, making the package unavailable, but it doesn't remove the data or the actual package file. Application can be unhidden by either resetting the hidden state or by installing it

Similar commenting is done for  *block* [here](https://android.googlesource.com/platform/frameworks/base/+/android-4.4.4_r2.0.1/core/java/android/content/pm/PackageManager.java#3160).

In order to verify the claim, you can use some system services such as `meminfo`, `procstats` and `activity` using the [dumpsys](https://source.android.com/devices/tech/debug/dumpsys.html) tool or even list all the processes using `ps`. You won't find an active presence of the blocked/hidden app.

The same goes for a lot of system apps disabled using GUI or `pm disable` but not for every app since even a  disabled app can receive [broadcasts](http://android.stackexchange.com/a/46097/96277) it has registered for, which can only be done if it is loaded into the memory. Nevertheless, it cannot act on its own, neither can it be executed by any other app.

I've argued some of the differences between  *hide*/*block* and *disable* on my question http://android.stackexchange.com/q/128949/96277. It provides only supplementary info to this answer so you may skip it.